【问题标题】:Setting date as getdate() for all the duplicates from tables and setting the date as null for the top 1 record将表中所有重复项的日期设置为 getdate() 并将前 1 条记录的日期设置为空
【发布时间】:2017-01-02 12:32:58
【问题描述】:

我有一张表,其中包含一组重复记录,用于输入 ID。我的要求是更新所有记录的日期列并将其设置为 getdate(),但对于重复项(原始记录)中的前 1 个记录,我必须将日期列设置为空。

我使用 cte 和 update 语句,但它们正在更新表中的所有记录,但我需要将前 1 条记录的日期列设置为空。

                                ;WITH CTE_Duplicate (application_ID, CW_Deferred_ID, DuplicateCount)
            AS (
                     SELECT application_ID, CW_Deferred_ID,Row_number()
                OVER ( PARTITION BY application_ID, CW_Deferred_ID ORDER BY application_ID) AS DuplicateCount
        FROM  dbo.Application_Refinance)


UPDATE dbo.Application_Refinance 
SET Inactive_Date = GETDATE()
               , Update_User = '13617'
       ,Update_Date = GETDATE()
FROM   CTE_Duplicate 
WHERE DuplicateCount > 1 and inactive_date  is NULL 

我需要添加一些条件,以便对于所有重复记录,更新语句将日期设置为 getdate,而对于前 1 条记录,我需要设置为空。

            ;WITH CTE_Duplicate (application_ID, CW_Deferred_ID, RowNumber)
            AS (
                     SELECT application_ID, CW_Deferred_ID,Row_number()
                OVER ( PARTITION BY application_ID, CW_Deferred_ID, CTE_Duplicate.RowNumber ORDER BY application_ID) AS Duplicate
        FROM  dbo.Application_Refinance)


UPDATE dbo.Application_Refinance 
SET Inactive_Date = CASE WHEN CTE_Duplicate.RowNumber = 1 
                         THEN NULL
                         else GETDATE()
                         end
               , Update_User = '13617'
       ,Update_Date = GETDATE()
FROM   CTE_Duplicate 
WHERE CTE_Duplicate.RowNumber > 1 

当我尝试这个时,我得到了这个错误

无法绑定多部分标识符“CTE_Duplicate.RowNumber”。

当我只运行选择部分时..

SELECT application_ID, CW_Deferred_ID, Inactive_date, Update_date, Update_user
                     ,Row_number() OVER ( PARTITION BY application_ID, CW_Deferred_ID ORDER BY application_ID) AS RowNum
        FROM  dbo.Application_Refinance

ID:112979 XXX:753-0514763 非活动日期:2016-12-29 12:22:54.533 更新日期:2016-12-29 12:22:54.533 行数:1

ID:112979
XXX:753-0514763 非活动日期:2016-12-29 12:22:54.533
更新日期:2016-12-29 12:22:54.533
行号:2

ID:112979
XXX:753-0514763 非活动日期:2016-12-29 12:22:54.533
更新日期:2016-12-29 12:22:54.533
行号:3

现在我想将 row= 1 设置为 Null 并将 row = 2 和 row=3 等设置为 getdate() 其中 id 的行数 >1

【问题讨论】:

    标签: sql sql-server date sql-update


    【解决方案1】:

    试试这个:

    WITH CTE_Duplicate 
                AS (
                         SELECT application_ID, CW_Deferred_ID, Inactive_date, Update_date, Update_user,
                         ,Row_number() OVER ( PARTITION BY application_ID, CW_Deferred_ID, ORDER BY application_ID) AS RowNum
            FROM  dbo.Application_Refinance)
    UPDATE CTE_Duplicate
    SET Inactive_Date = CASE WHEN RowNum = 1 
                             THEN NULL
                             else GETDATE()
                             end
                   , Update_User = '13617'
           ,Update_Date = GETDATE()
    FROM   CTE_Duplicate 
    WHERE Inactive_date IS NULL;
    

    【讨论】:

    • 表中有一个日期列,对于所有重复记录,我必须将日期设置为 getdate(),但对于那些重复记录中的 top1 记录,我必须设置为空。我希望这会让你明白我想要什么。谢谢
    • 好的。然后,您可以将上述语句应用于该日期列。问题解决了。
    • 我用我得到的错误编辑了这个问题,你能帮我解决一下吗
    • 它说无效的列名'Inactive_Date'
    • @kris 再试一次
    猜你喜欢
    • 2016-01-03
    • 2023-04-03
    • 2015-07-17
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多