sql - 如何给分组的行编号
问题描述
有一个表格,其中存储了如下视频观看日志的数据。
|user_id| status | time |
-------------------------------------
|user_a |start |2019-06-18 00:00:00|
|user_a |progress|2019-06-18 00:00:05|
|user_a |progress|2019-06-18 00:00:10|
|user_a |complete|2019-06-18 00:00:15|
|user_a |start |2019-06-18 00:10:00|
|user_a |complete|2019-06-18 00:10:05|
|user_a |start |2019-06-19 00:10:00|
|user_a |start |2019-06-19 00:10:05|
|user_a |progress|2019-06-19 00:10:10|
|user_b |start |2019-06-18 00:20:00|
|user_b |progress|2019-06-18 00:20:05|
|user_b |progress|2019-06-18 00:20:10|
我想为从状态“开始”到“开始”的每个 user_id 的行赋予相同的编号,如下所示。
id|user_id| status | time |
-------------------------------------
1|user_a |start |2019-06-18 00:00:00|
1|user_a |progress|2019-06-18 00:00:05|
1|user_a |progress|2019-06-18 00:00:10|
1|user_a |complete|2019-06-18 00:00:15|
2|user_a |start |2019-06-18 00:10:00|
2|user_a |complete|2019-06-18 00:10:05|
3|user_a |start |2019-06-19 00:10:00|
4|user_a |start |2019-06-19 00:10:05|
4|user_a |progress|2019-06-19 00:10:10|
1|user_b |start |2019-06-18 00:20:00|
1|user_b |progress|2019-06-18 00:20:05|
1|user_b |progress|2019-06-18 00:20:10|
有没有办法用sql聚合?我正在使用presto。
解决方案
使用累积和:
select t.*,
sum(case when status = 'start' then 1 else 0 end) over (partition by user_id order by time) as id
from t;
推荐阅读
- linux - 实现 wc 和 head 控件的功能
- django - 如何在 django models.py 中为用户名(不是用户 ID)创建 ForeignKey
- java - 在在线编译器 jdoodle.com 上运行 java 并遇到一些问题
- fiware - Orion 是否与 AWS DocumentDB 兼容
- php - 如何使用 REST API 和 PHP 向页面添加附件?
- excel - Excel:其他范围的条件格式
- angular - 角度中没有将“exportAs”设置为“ngForm”的指令
- vb.net - 如何解决错误:“列名或提供的值的数量与表定义不匹配”?
- kubernetes - AKS cilium 单节点集群不接受连接
- javascript - RangeError:超过最大调用大小,创建条带会话