问题描述
问题:
获取 type='Onsite Repair' 的记录以及具有 仅当同一日期的同一 Act_ID 中还有 Type='Travel' 的行时,才输入('Calibration'、'Interface Troubleshooting'、'Setup/Configuration'、'Customer Applications')。别的无视。 (应始终显示现场维修类型的记录)
Type = "现场维修" 要么 Type = ("Calibration","Interface Troubleshooting","Setup/Configuration","Customer Applications") 仅当在同一日期的同一 Act_ID 中还有 Type="Travel" 的行时。否则忽略类型。
- 源数据
ACT_ID | TYPE | START_TS | END_TS |
---|---|---|---|
ACTID1 | 旅行 | 7/20/2016 13:00 | 7/20/2016 15:30 |
ACTID1 | 界面故障排除 | 7/20/2016 15:30 | 7/20/2016 19:00 |
ACTID1 | 旅行 | 7/20/2016 19:00 | 7/20/2016 21:00 |
ACTID1 | 旅行 | 9/20/2016 13:00 | 9/20/2016 15:30 |
ACTID1 | 现场维修 | 9/20/2016 15:30 | 9/20/2016 23:30 |
ACTID1 | 旅行 | 9/21/2016 13:00 | 9/21/2016 15:30 |
ACTID1 | 现场维修 | 9/21/2016 15:30 | 9/21/2016 23:30 |
ACTID1 | 旅行 | 9/22/2016 13:00 | 9/22/2016 15:30 |
ACTID1 | 现场维修 | 9/22/2016 15:30 | 9/22/2016 23:30 |
- 预期数据
ACT_ID | TYPE | START_TS | END_TS |
---|---|---|---|
ACTID1 | 界面故障排除 | 7/20/2016 15:30 | 7/20/2016 19:00 |
ACTID1 | 现场维修 | 9/20/2016 15:30 | 9/20/2016 23:30 |
ACTID1 | 现场维修 | 9/21/2016 15:30 | 9/21/2016 23:30 |
ACTID1 | 现场维修 | 9/22/2016 15:30 | 9/22/2016 23:30 |
解决方法
窗口聚合的简单任务加上限定:
select *
from table
qualify Type = 'Onsite Repair'
OR (Type = in ('Calibration','Interface Troubleshooting','Setup/Configuration','Customer Applications')
-- row with Type='Travel'
AND count(case when Type='Travel' then 1 end)
-- same Act_ID on the same date
over (partition by Act_ID,cast(START_TS as date) > 0
)