【问题标题】:Complex Scenario Teradata Query From Single Table单表复杂场景 Teradata 查询
【发布时间】:2021-09-16 15:00:07
【问题描述】:

问题:

获取具有 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 Travel 7/20/2016 13:00 7/20/2016 15:30
ACTID1 Interface Troubleshooting 7/20/2016 15:30 7/20/2016 19:00
ACTID1 Travel 7/20/2016 19:00 7/20/2016 21:00
ACTID1 Travel 9/20/2016 13:00 9/20/2016 15:30
ACTID1 Onsite Repair 9/20/2016 15:30 9/20/2016 23:30
ACTID1 Travel 9/21/2016 13:00 9/21/2016 15:30
ACTID1 Onsite Repair 9/21/2016 15:30 9/21/2016 23:30
ACTID1 Travel 9/22/2016 13:00 9/22/2016 15:30
ACTID1 Onsite Repair 9/22/2016 15:30 9/22/2016 23:30
  • 预期数据
ACT_ID TYPE START_TS END_TS
ACTID1 Interface Troubleshooting 7/20/2016 15:30 7/20/2016 19:00
ACTID1 Onsite Repair 9/20/2016 15:30 9/20/2016 23:30
ACTID1 Onsite Repair 9/21/2016 15:30 9/21/2016 23:30
ACTID1 Onsite Repair 9/22/2016 15:30 9/22/2016 23:30

【问题讨论】:

  • 到目前为止你尝试过什么?你知道怎么做吗:获取 type='Onsite Repair' 的记录以及 Type in ('Calibration', 'Interface Troubleshooting', 'Setup/Configuration', '客户应用')
  • 嗨@Nick.McDermaid,我在下面写了查询及其工作,但我正在寻找更简单的查询而不是执行自联接。 SELECT * FROM WHERE TYPE = 'Onsite Repair' UNION SELECT * FROM TABLE A INNER JOIN TABLE B ON A.ACT_ID = B.ACT_ID WHERE A.PROJ_NAM IN ('Calibration', 'Interface Troubleshooting', 'Setup/Configuration', '客户应用') AND B.TYPE='旅行' AND CAST(A.START_TS AS DATE FORMAT 'YYYY-MM-DD') = CAST(B.START_TS AS DATE FORMAT 'YYYY-MM-DD');跨度>

标签: sql teradata teradata-sql-assistant scenarios teradatasql


【解决方案1】:

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
        ) 

【讨论】:

  • 谢谢@dnoeth。该查询的答案集与我编写的查询答案集完全匹配,并且我认为是正确的。你能帮我了解一下合格部分的处理吗?我知道qualify 像过滤条件一样工作,但我对如何处理这部分更好奇(Type = in ('Calibration','Interface Troubleshooting', 'Setup/Configuration','Customer Applications') AND count(case when Type ='Travel' then 1 end) over (partition by Act_ID, cast(START_TS as date)) > 0
  • QUALIFY 在 WHERE/GROUP BY/HAVING 之后处理,Group Count 应用聚合逻辑而不丢失详细信息行。
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2023-03-20
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多