我有这种格式的数据:
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
列数据类型:日期
答案 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