微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自单表的复杂场景 Teradata 查询

如何解决来自单表的复杂场景 Teradata 查询

问题:

获取 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
        ) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。