Sql 在分组时,如何将条件限制为数据的子集?

Sql 在分组时,如何将条件限制为数据的子集?,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,假设是: | ID | Customer | Agent | Event | Date | |====|==========|==========|===========|============| | 01 | Steve | Jerry | Booked | 2019-01-01 | | 02 | Steve | Jerry | Canceled | 2019-01-13 | | 03 | Steve | Rusty |

假设是:

| 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       |
我正在尝试添加一个“取消后预订代理”列,使其如下所示:

| Customer | Agent    | BookDate   | CancelDate | Agent2   |
|==========|==========|============|============|==========|
| Steve    | Jerry    | 2019-01-01 | 2019-01-13 | Rusty    |
| Carla    | JSnow    | 2019-01-04 | NULL       | NULL     |

我不知道如何将代理名称的聚合限制为仅包括“预订”日期超过“取消”日期(如果存在)的事件。

我不认为仅使用聚合就可以做到这一点。但是在子查询中添加一个
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;

你也可以添加你的预期输出吗?谢谢!这起作用了。我最终使用了超前而不是滞后,但解决方案奏效了。请注意,这种方法确实需要在Snowflake中的每个迭代上进行100%的表扫描,并且不会缓存任何内容,并且可能需要更长的时间。