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%的表扫描,并且不会缓存任何内容,并且可能需要更长的时间。