如何根据组内日期之间的差异更改列?

Posted

技术标签:

【中文标题】如何根据组内日期之间的差异更改列?【英文标题】:How to change a column based on the difference between dates within a group? 【发布时间】:2021-04-14 02:11:49 【问题描述】:

这可能是一个简单的问题,但我是 SQL 的菜鸟。我正在使用黑斑羚。所以我有这样的数据:

New_ID Date Old_ID
1 2020-11-14 12:41:21 0
1 2020-11-14 12:50:40 1
2 2020-10-14 15:22:00 1.5
2 2020-12-18 11:31:05 2
3 2020-11-14 12:42:25 3

假设我按 New_ID 分组,我需要检查日期与紧随其后的日期(如果存在)之间的差异是否小于 2 个月(假设为 60 天)。如果差异大于 2 个月,那么我需要将 New_ID 更改为 Old_ID。如果小于或等于 2 个月,则 New_ID 可以保持不变。本质上,我希望新表如下所示:

New_ID Date Old_ID
1 2020-11-14 12:41:21 0
1 2020-11-14 12:50:40 1
1.5 2020-10-14 15:22:00 1.5
2 2020-12-18 11:31:05 2
3 2020-11-14 12:42:25 3

我已经尝试过这段代码片段和它的变体,但是 1. 我不确定如何处理空值和 2. 我不断收到语法错误“无法解析列/字段引用 'day'”

SELECT New_ID, Old_ID, Date,
LAG(Date) OVER(partition by New_ID ORDER BY Date) as previous_date,
case when datediff(day, previous_date, Date)/30.0 >= 2 then Old_ID
else New_ID end as 'new_identifier'
From MYTABLE;

任何指针/建议将不胜感激。

【问题讨论】:

【参考方案1】:

Impala 日期函数是 months_between() -- 并且 previous_date 无法识别,因此您需要重复表达式:

SELECT New_ID, Old_ID, Date,
       LAG(Date) OVER (partition by New_ID ORDER BY Date) as previous_date,
       (case when months_between(date, LAG(Date) OVER (partition by New_ID ORDER BY Date)) >= 2 then Old_ID
             else New_ID
         end) as new_identifier
From MYTABLE;

【讨论】:

以上是关于如何根据组内日期之间的差异更改列?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算Python Pandas中两列之间的日期差异[重复]

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?

如何计算两个日期之间的差异?

sql查询计算不同列和相邻行的两个日期之间的差异

根据两列中的匹配值为日期差异创建条件列

在 Swift 中计算两个日期之间的差异