CASE WHEN 更改重复值

CASE WHEN for changing duplicate value

提问人:Nairda123 提问时间:9/19/2023 最后编辑:Nairda123 更新时间:9/19/2023 访问量:36

问:

我正在尝试添加一个 case when 语句,如果每两列有重复项,该语句会将 +1day 添加到记录的日期列中。

这将是原始表:

一个 B C
桌子 2023-01-01
桌子 2023-01-01

这将是结果:

一个 B C
桌子 2023-01-01
桌子 2023-01-02

我知道使用 DATEADD 足以更新日期,但无法理解如何抓取重复字段并在列选择期间的 case when 语句中只更新其中一个字段。select DATEADD( 'day',1,'2023-09-13')::date;

编辑:如果A列和B列相同,我希望第二列记录C更新为+1天。

CASE    
        WHEN ROW_NUMBER() OVER (PARTITION BY a,b > 1) 
            THEN DATEADD('day', 1, a)
        ELSE a
        END AS c

例如,像这样的东西会更新两行。

任何帮助都表示赞赏。

SQL Amazon-Redshift 案例 数据操作

评论

0赞 Tim Biegeleisen 9/19/2023
如何将记录定义为重复记录?
0赞 dougp 9/19/2023
您应该能够通过包含主键来区分两者,主键可能应该是代理键。如果这是真正重复的记录(任何列之间没有区别),则没有主键。也许解雇你的数据建模师并重新开始?
0赞 Nairda123 9/19/2023
@TimBiegeleisen我已经更新了问题,但它将是 A 列和 B 列中的相同记录。

答:

1赞 Tim Biegeleisen 9/19/2023 #1

你走在正确的轨道上。您应该使用减 1 的结果作为添加到日期的天数:ROW_NUMBER

SELECT *, DATEADD(
              'day',
              ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY C) - 1,
              C) AS new_date
FROM yourTable
ORDER BY 1, 2, 3;

为了解决您的后续问题,您只想在某一列与特定值不匹配时增加日期,您可以使用:D

DATEADD(
    'day',
    COUNT(CASE WHEN D != 123 THEN 1 END) OVER (PARTITION BY A, B ORDER BY C) - 1,
    C)

评论

0赞 Nairda123 9/19/2023
这正是我正在寻找的,谢谢!有没有办法对加法列强制检查,比如说可以确保这些记录的 D 列 != D?
0赞 Tim Biegeleisen 9/19/2023
是的,在 之后添加一个子句,例如WHEREFROMWHERE D != <some value>
0赞 Nairda123 9/19/2023
案例陈述内部呢?要仍然包含这些行,但如果重复的 D 列不匹配,则仅更新。