[英]How to change a column based on the difference between dates within a group?
這可能是一個簡單的問題,但我是 SQL 的菜鳥。我正在使用 Impala。 所以我有這樣的數據:
新ID | 日期 | 舊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 可以保持不變。 本質上,我希望新表看起來像這樣:
新ID | 日期 | 舊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. 我不確定如何處理 null 值和 2. 我不斷收到語法錯誤“無法解析列/字段引用‘天’”
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;
任何指針/建議將不勝感激。
Impala 日期 function 是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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.