来自单个 Table 的复杂场景 Teradata 查询
Complex Scenario Teradata Query From Single Table
问题:
获取 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
类型
START_TS
END_TS
ACTID1
旅行
2016 年 7 月 20 日 13:00
2016 年 7 月 20 日 15:30
ACTID1
接口故障排除
2016 年 7 月 20 日 15:30
2016 年 7 月 20 日 19:00
ACTID1
旅行
2016 年 7 月 20 日 19:00
2016 年 7 月 20 日 21:00
ACTID1
旅行
2016 年 9 月 20 日 13:00
2016 年 9 月 20 日 15:30
ACTID1
现场维修
2016 年 9 月 20 日 15:30
2016 年 9 月 20 日 23:30
ACTID1
旅行
9/21/201613:00
9/21/201615:30
ACTID1
现场维修
9/21/201615:30
2016 年 9 月 21 日 23:30
ACTID1
旅行
9/22/201613:00
2016 年 9 月 22 日 15:30
ACTID1
现场维修
2016 年 9 月 22 日 15:30
9/22/201623:30
- 预期数据
ACT_ID
类型
START_TS
END_TS
ACTID1
接口故障排除
2016 年 7 月 20 日 15:30
2016 年 7 月 20 日 19:00
ACTID1
现场维修
2016 年 9 月 20 日 15:30
2016 年 9 月 20 日 23:30
ACTID1
现场维修
9/21/201615:30
2016 年 9 月 21 日 23:30
ACTID1
现场维修
2016 年 9 月 22 日 15:30
9/22/201623:30
Windowed Aggregate 加上限定的简单任务:
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
)
问题:
获取 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 | 类型 | START_TS | END_TS |
---|---|---|---|
ACTID1 | 旅行 | 2016 年 7 月 20 日 13:00 | 2016 年 7 月 20 日 15:30 |
ACTID1 | 接口故障排除 | 2016 年 7 月 20 日 15:30 | 2016 年 7 月 20 日 19:00 |
ACTID1 | 旅行 | 2016 年 7 月 20 日 19:00 | 2016 年 7 月 20 日 21:00 |
ACTID1 | 旅行 | 2016 年 9 月 20 日 13:00 | 2016 年 9 月 20 日 15:30 |
ACTID1 | 现场维修 | 2016 年 9 月 20 日 15:30 | 2016 年 9 月 20 日 23:30 |
ACTID1 | 旅行 | 9/21/201613:00 | 9/21/201615:30 |
ACTID1 | 现场维修 | 9/21/201615:30 | 2016 年 9 月 21 日 23:30 |
ACTID1 | 旅行 | 9/22/201613:00 | 2016 年 9 月 22 日 15:30 |
ACTID1 | 现场维修 | 2016 年 9 月 22 日 15:30 | 9/22/201623:30 |
- 预期数据
ACT_ID | 类型 | START_TS | END_TS |
---|---|---|---|
ACTID1 | 接口故障排除 | 2016 年 7 月 20 日 15:30 | 2016 年 7 月 20 日 19:00 |
ACTID1 | 现场维修 | 2016 年 9 月 20 日 15:30 | 2016 年 9 月 20 日 23:30 |
ACTID1 | 现场维修 | 9/21/201615:30 | 2016 年 9 月 21 日 23:30 |
ACTID1 | 现场维修 | 2016 年 9 月 22 日 15:30 | 9/22/201623:30 |
Windowed Aggregate 加上限定的简单任务:
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
)