【问题标题】:SQL Grouping with Additional Checks带有附加检查的 SQL 分组
【发布时间】:2021-12-18 03:06:05
【问题描述】:

我有一个结构如下的表

id event_name event_date
1 a 1.1.2019
1 b 2.1.2019
1 c 2.3.2019
2 a 3.2.2020
2 b 5.1.2020
2 c 4.2.2020
3 a 1.2.2020
3 b 5.2.2020
3 c 3.2.2020
4 a 3.2.2020
4 c 4.2.2020

我想对 id 进行分组,之后我必须检查 event_names 的顺序是否与 event_date 的顺序相匹配,例如 'a' 的 event_date

  • 当'a'的event_date
  • “b”的 event_date
  • “c”的 event_date
  • 当组中没有事件“b”时“缺少 b”

在这个例子中,这将导致

id event_check
1 ok
2 too early
3 too late
4 missing b

【问题讨论】:

  • 您使用的是什么 DBMS?
  • @id'7238 Teradata 16.20

标签: sql group-by teradata


【解决方案1】:

试试下面的 SQL 语句,它应该适用于大多数 DBMS。

SELECT
  id,
  CASE 
    WHEN event_date_a < event_date_b AND event_date_b < event_date_c THEN 'ok'
    WHEN event_date_b < event_date_a THEN 'too early'
    WHEN event_date_c < event_date_b THEN 'too late'
    WHEN event_date_b IS NULL THEN 'missing b'
  END AS event_check
FROM (
  SELECT 
    id,
    MIN(CASE WHEN event_name = 'a' THEN event_date END) AS event_date_a,
    MIN(CASE WHEN event_name = 'b' THEN event_date END) AS event_date_b,
    MIN(CASE WHEN event_name = 'c' THEN event_date END) AS event_date_c
  FROM mytable
  GROUP BY id
) agg  

【讨论】:

  • 这就是我解决问题的方法,但我不确定这是否是解决问题的最快方法。使用额外的选择而不是使用 'Min(event a) 执行 MIN(...) 是否会提高性能
  • 我认为它不会影响性能。检查查询执行计划。这是一个没有子查询并比较他们的计划的例子 - fiddle
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多