2017-09-18 30 views
0

目前,我有,看起來表象下面這樣:如何在一個表中更新基於共享ID列

ID|Date |Val1|Val2|   
1 |1/1/2016|1000|0   
2 |1/1/2016|Null|0 
3 |1/1/2016|Null|0 
1 |2/1/2016|1000|0 
2 |2/1/2016|Null|0 
3 |2/1/2016|1000|0 
1 |3/1/2016|1000|0 
2 |3/1/2016|1000|0 
3 |3/1/2016|1000|0 

我想val2成爲1如果Val1在前面month填充,所以輸出將如下所示:

ID|Date |Val1|Val2|   
1 |1/1/2016|1000|0   
2 |1/1/2016|Null|0 
3 |1/1/2016|Null|0  
1 |2/1/2016|1000|1 
2 |2/1/2016|Null|0 
3 |2/1/2016|1000|0  
1 |3/1/2016|1000|1 
2 |3/1/2016|1000|0 
3 |3/1/2016|1000|1 

我已經試過了幾碼的組合,但有條件的地方Val1第一次出現被絆倒了我以前的數據更新的價值。我會很感激任何幫助!

+1

什麼是'日期的數據類型-----'柱?正如所寫的,它看起來像一個'VARCHAR'而不是'DATE'。 – Siyual

+0

你的桌子上是否有其他月份的日子(不是第一天)?您是否可以爲給定的ID **和**日期提供多條記錄? –

+0

你能解釋一下爲什麼2月份的val2只有1個,而3月份的只有2個1? – LONG

回答

0

您可以通過窗口LAG()來查找以前的值,如果它的值爲NOT NULL,則更新Val2

;With Cte As 
(
    Select Id, [Date-----], Val1, Val2, 
      Lag(Val1) Over (Partition By Id Order By [Date-----] Asc) As Prev 
    From LikeBelow 
) 
Update Cte 
Set  Val2 = 1 
Where Prev Is Not Null; 

如果你實際上是存儲您的日期爲VARCHAR,而不是一個DATE,你需要將其轉換:

;With Cte As 
(
    Select Id, [Date-----], Val1, Val2, 
      Lag(Val1) Over (Partition By Id 
          Order By Convert(Date, [Date-----]) Asc) As Prev 
    From LikeBelow 
) 
Update Cte 
Set  Val2 = 1 
Where Prev Is Not Null; 
+0

這不適用於使用CTE,但選擇到一個單獨的表中的值,然後運行此查詢實現了所需的結果。 –

相關問題