如何基于ID和状态码为数据集添加活动块标识列
如何为每个ID按状态0划分活动块(Block)
给定如下结构的数据集(已按datetime排序):
| id | status | datetime |
|---|---|---|
| 123456 | 0 | 07/02/2023 12:43 |
| 123456 | 4 | 07/02/2023 12:49 |
| 123456 | 5 | 07/02/2023 12:58 |
| 123456 | 5 | 07/02/2023 13:48 |
| 123456 | 7 | 07/02/2023 14:29 |
| 123456 | 0 | 07/02/2023 14:50 |
| 123456 | 4 | 07/02/2023 14:50 |
| 123456 | 5 | 07/02/2023 14:51 |
| 123456 | 9 | 07/02/2023 15:27 |
| 567890 | 0 | 07/02/2023 11:44 |
| 567890 | 4 | 07/02/2023 12:23 |
| 567890 | 5 | 07/02/2023 12:29 |
| 567890 | 5 | 07/02/2023 13:26 |
| 567890 | 5 | 07/02/2023 13:28 |
| 567890 | 5 | 07/02/2023 13:28 |
| 567890 | 5 | 07/02/2023 13:29 |
| 567890 | 9 | 07/02/2023 13:55 |
需要为每个ID划分活动块,每个块以status=0为起始,最终得到带block列的结果:
| id | status | datetime | block |
|---|---|---|---|
| 123456 | 0 | 07/02/2023 12:43 | 1 |
| 123456 | 4 | 07/02/2023 12:49 | 1 |
| 123456 | 5 | 07/02/2023 12:58 | 1 |
| 123456 | 5 | 07/02/2023 13:48 | 1 |
| 123456 | 7 | 07/02/2023 14:29 | 1 |
| 123456 | 0 | 07/02/2023 14:50 | 2 |
| 123456 | 4 | 07/02/2023 14:50 | 2 |
| 123456 | 5 | 07/02/2023 14:51 | 2 |
| 123456 | 9 | 07/02/2023 15:27 | 2 |
| 567890 | 0 | 07/02/2023 11:44 | 1 |
| 567890 | 4 | 07/02/2023 12:23 | 1 |
| 567890 | 5 | 07/02/2023 12:29 | 1 |
| 567890 | 5 | 07/02/2023 13:26 | 1 |
| 567890 | 5 | 07/02/2023 13:28 | 1 |
| 567890 | 5 | 07/02/2023 13:28 | 1 |
| 567890 | 5 | 07/02/2023 13:29 | 1 |
| 567890 | 9 | 07/02/2023 13:55 | 1 |
实现思路
核心是利用窗口累加函数,对每个ID分组后,统计从第一条记录到当前记录中status=0出现的次数——这个次数就是当前记录所属的block编号,每遇到一个0,累加值加1,后续所有记录直到下一个0出现前都属于这个block。
通用SQL代码
SELECT id, status, datetime, SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) OVER ( PARTITION BY id ORDER BY datetime ) AS block FROM your_table_name ORDER BY id, datetime;
代码说明
PARTITION BY id:按ID分组,确保每个ID的block编号独立计算ORDER BY datetime:保证按时间顺序累加,符合数据已排序的业务逻辑SUM(CASE WHEN status=0 THEN 1 ELSE 0 END):遇到status=0时标记为1,否则为0,累加这些标记值得到block编号- 多数SQL引擎中,
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW是窗口函数的默认范围,因此可以省略
执行上述SQL后,即可得到你期望的带block列的结果。
内容的提问来源于stack exchange,提问作者Mat Richardson
相关产品推荐
相关产品推荐

