组的增量日期更新

时间:2017-09-28 09:34:51

标签: sql db2 db2-luw

我有这种格式的数据:

ID| DATE
--------
1 | 02/23/2014
1 | 05/15/2011
1 | 01/05/2017
2 | 12/21/2013
3 | 10/10/2016
3 | 09/05/2015

对于每个ID组,我想更新从昨天开始的日期(递减顺序)。 考虑到今天的日期是09/28/2017,输出应该是:

ID | DATE
--------
1 | 09/27/2017
1 | 09/26/2017
1 | 09/25/2017
2 | 09/27/2017
3 | 09/27/2016
3 | 09/26/2017

我的方法是(不起作用)

UPDATE TABLE
SET DATE = CURRENT DATE - p.a days
FROM (
    SELECT DATE
        ,ID
        ,ROW_NUMBER() OVER (
            PARTITION BY ID ORDER BY ID ASC
            ) a
    FROM TABLE
    ) p
WHERE DATE = p.DATE
    AND ID = p.ID
WITH ur;

请建议任何方法来实现同样的目标。

编辑:

数据库:DB2

错误:

  

错误[42601] [IBM] [DB2 / AIX64] SQL0104N一个意外的令牌"来自"在"租赁日期 - p.a天"之后被发现。预期的代币可能包括:""。

Date列数据类型:日期

2 个答案:

答案 0 :(得分:0)

你可以使用它。

DECLARE @Today DATE = GETDATE()

SELECT ID,  
    DATEADD(DAY
         , -1 * (ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [DATE] DESC)), @Today) [DATE] 
FROM MyTable

更新

DECLARE @Today DATE = GETDATE()

;WITH T AS (
    SELECT 
        ID, 
        [DATE],  
        DATEADD(DAY,-1 * (ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [DATE] DESC)), @Today) [NEW_DATE] 
    FROM MyTable
)
UPDATE M 
    SET [DATE] = T.[NEW_DATE]
FROM 
    MyTable M INNER JOIN T ON  M.ID = T.ID AND M.[DATE] = T.[DATE]

答案 1 :(得分:0)

这应该可以解决问题

for db2:

update t 
    set DATE = NewDate
from TABLE t
join (
    select T.DATE, T.ID, (CURRENT DATE - ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.ID ASC)) NewDate
    FROM TABLE T
) p  on t.DATE = p.DATE and t.ID = p.ID

for sql-server:

update t 
    set DATE = DATEADD(DAY, -p.a, GETDATE())
from TABLE t
join (
    select T.DATE, T.ID, ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.ID ASC) a
    FROM TABLE T
) p  on t.DATE = p.DATE and t.ID = p.ID