【问题标题】:Incremental Date Update for Groups组的增量日期更新
【发布时间】:2018-03-09 23:56:39
【问题描述】:

我有这种格式的数据:

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列数据类型:日期

【问题讨论】:

  • 您使用的是哪个 dbms? (该查询尝试是特定于产品的。)
  • 列日期的数据类型?
  • 您遇到了哪个错误?
  • 按分区下的列排序对结果没有影响。如果优化器删除该子句,我不会感到惊讶。你的意思是'DATE'?但是,如果这些是您仅有的两列,则排序无关紧要(因为数据已被覆盖)。
  • 你解决了吗?你找到有用的答案了吗?

标签: sql db2 db2-luw


【解决方案1】:

你可以用这个。

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]

【讨论】:

    【解决方案2】:

    这应该可以解决问题

    对于 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
    

    对于 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
    

    【讨论】:

    • DATEADD 函数在 DB2 中不起作用。当我将 DATEADD 替换为“当前日期 - p.a 天”时,我遇到了与 OP 中提到的相同的错误
    • 试试这个,我认为问题可能在于您的更新中缺少加入或无法识别的p.a 符号。我已将其更改为NewDate
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多