分组时如何将条件限制为 CASE 中的数据子集?
How do I limit a condition to a subset of data in a CASE when grouping?
假设 table:
| ID | Customer | Agent | Event | Date |
|====|==========|==========|===========|============|
| 01 | Steve | Jerry | Booked | 2019-01-01 |
| 02 | Steve | Jerry | Canceled | 2019-01-13 |
| 03 | Steve | Rusty | Booked | 2019-01-16 |
| 04 | Carla | JSnow | Booked | 2019-01-04 |
| 05 | Carla | JSnow | Resched | 2019-01-16 |
我有一个查询,将事件列表分组到它们的所有者中,检测第一个预订日期,并记录第一个预订的代理:
SELECT
Customer,
FIRST_VALUE(Agent),
MIN(CASE WHEN Event = 'Booked' THEN Date END) as BookDate,
MIN(CASE WHEN Event = 'Canceled' THEN Date END) as CancelDate
FROM Events
GROUP BY Customer
// produces:
| Customer | Agent | BookDate | CancelDate |
|==========|==========|============|============|
| Steve | Jerry | 2019-01-01 | 2019-01-13 |
| Carla | JSnow | 2019-01-04 | NULL |
我正在尝试添加一个 "Booking Agent After Cancel" 列,使其看起来像这样:
| Customer | Agent | BookDate | CancelDate | Agent2 |
|==========|==========|============|============|==========|
| Steve | Jerry | 2019-01-01 | 2019-01-13 | Rusty |
| Carla | JSnow | 2019-01-04 | NULL | NULL |
我不知道如何将代理名称的聚合限制为仅包含 'Booked' 日期超过 'Canceled' 日期(如果存在)的事件。
我认为没有任何方法可以仅通过聚合来做到这一点。但是在子查询中添加 LAG()
可以为您提供所需的信息:
SELECT Customer, FIRST_VALUE(Agent),
MIN(CASE WHEN Event = 'Booked' THEN Date END) as BookDate,
MIN(CASE WHEN Event = 'Canceled' THEN Date END) as CancelDate,
MIN(CASE WHEN prev_event = 'Canceled' THEN Agent END) as Agent2
FROM (SELECT e.*,
LAG(Event) OVER (PARTITION BY Customer ORDER BY Date) as prev_event
FROM Events e
) e
GROUP BY Customer;
假设 table:
| ID | Customer | Agent | Event | Date |
|====|==========|==========|===========|============|
| 01 | Steve | Jerry | Booked | 2019-01-01 |
| 02 | Steve | Jerry | Canceled | 2019-01-13 |
| 03 | Steve | Rusty | Booked | 2019-01-16 |
| 04 | Carla | JSnow | Booked | 2019-01-04 |
| 05 | Carla | JSnow | Resched | 2019-01-16 |
我有一个查询,将事件列表分组到它们的所有者中,检测第一个预订日期,并记录第一个预订的代理:
SELECT
Customer,
FIRST_VALUE(Agent),
MIN(CASE WHEN Event = 'Booked' THEN Date END) as BookDate,
MIN(CASE WHEN Event = 'Canceled' THEN Date END) as CancelDate
FROM Events
GROUP BY Customer
// produces:
| Customer | Agent | BookDate | CancelDate |
|==========|==========|============|============|
| Steve | Jerry | 2019-01-01 | 2019-01-13 |
| Carla | JSnow | 2019-01-04 | NULL |
我正在尝试添加一个 "Booking Agent After Cancel" 列,使其看起来像这样:
| Customer | Agent | BookDate | CancelDate | Agent2 |
|==========|==========|============|============|==========|
| Steve | Jerry | 2019-01-01 | 2019-01-13 | Rusty |
| Carla | JSnow | 2019-01-04 | NULL | NULL |
我不知道如何将代理名称的聚合限制为仅包含 'Booked' 日期超过 'Canceled' 日期(如果存在)的事件。
我认为没有任何方法可以仅通过聚合来做到这一点。但是在子查询中添加 LAG()
可以为您提供所需的信息:
SELECT Customer, FIRST_VALUE(Agent),
MIN(CASE WHEN Event = 'Booked' THEN Date END) as BookDate,
MIN(CASE WHEN Event = 'Canceled' THEN Date END) as CancelDate,
MIN(CASE WHEN prev_event = 'Canceled' THEN Agent END) as Agent2
FROM (SELECT e.*,
LAG(Event) OVER (PARTITION BY Customer ORDER BY Date) as prev_event
FROM Events e
) e
GROUP BY Customer;