2016-08-27 23 views
0

我正在跟蹤訂閱&訂閱電子報的客戶的移動。所以基本上任何人都訂閱,他的詳細信息將被填入SQL表和訂閱日期。如果同一用戶取消訂閱,則會在未訂閱日期插入新記錄。如果同一客戶再次訂購,則會在表中插入第三條記錄。爲同一位客戶查找最新記錄

我在我的表中有一列顯示客戶的最新狀態,無論他是否訂閱。棘手的部分是我只希望第三個記錄有「是」這個詞。我所試圖做的是一個循環都要經過我的所有記錄&標記「是」如果這是客戶

最新記錄謝謝

+0

樣本數據和預期的結果有些事情是在傳達你想要做的事情真的很有幫助。 –

+0

是的,你應該顯示你的示例代碼。 – Developer

回答

0

你可以做一個更新。事情是這樣的:

with toupdate as (
     select s.*, 
      row_number() over (partition by customer_id order by date desc) as seqnum 
     from subscriptions s 
    ) 
update s 
    set is_last_subscription = (case when seqnum = 1 and subscription_date is not null then 'YES' end); 

不過,我猜你有一個客戶/用戶表,當你需要它或更新表倒不如要麼計算值。

0
update T 
set Flag = 'Yes' 
where not exists (
    select 1 from T t2 
    where t2.CustomerId = T.CustomerId 
     and t2.Timestamp > T.Timestamp 
); 

這是經典的基於集合的方法。它將在沒有窗口功能的平臺上工作,並且避免了更新中破壞的from子句。

+0

@lmo這是SQL下最常見的問題之一。我對這些股票答案的觀點漠不關心。 – shawnt00

0

你可以嘗試類似

UPDATE [DBO].[SUBSCRIBE] SET [STATUS] = 0 WHERE [CUSTOMERNAME] = 'A' 
UPDATE [DBO].[SUBSCRIBE] SET [STATUS] = 1 WHERE [ID] IN 
(SELECT TOP 1 [ID] FROM [DBO].[SUBSCRIBE] ORDER BY [SUBSCRIPTIONDATE] DESC) 
0
Update t set status = 
    case when z.LastSub >= z.LastUnSUb 
     then 'Yes' else 'No' end 
From table t join 
    (Select ClientID, 
     Max(SubscriptionDate) LastSub, 
     Max(UnsubscriptionDate) LasUnSub 
    From table 
    Group by ClientID) z 
On z.ClientId = t.ClientId