首页 > 解决方案 > 带有附加检查的 SQL 分组

问题描述

我有一个具有以下结构的表

ID 事件名称 活动日期
1 一个 1.1.2019
1 b 2.1.2019
1 C 2.3.2019
2 一个 3.2.2020
2 b 5.1.2020
2 C 4.2.2020
3 一个 1.2.2020
3 b 5.2.2020
3 C 3.2.2020
4 一个 3.2.2020
4 C 4.2.2020

我想对 id 进行分组,之后我必须检查 event_names 的顺序是否与 event_date 的顺序相匹配,例如 event_date for 'a' < event_date for 'b' < event_date for 'c'。此外,我必须检查事件“b”是否在表中(如果是,则顺序不再重要)。这将导致列“event_check”具有以下值:

在这个例子中,这将导致

ID 事件检查
1 好的
2 太早了
3 为时已晚
4 缺少 b

标签: sqlgroup-byteradata

解决方案


试试下面的 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  

推荐阅读