【发布时间】:2021-01-28 21:59:36
【问题描述】:
我有带有 user_id、时间戳和是/否答案的行。我想计算每个 ID 有多少条“NO”(连续行)。
例子:
| user_id | timestamp | response | no_streak |
|---|---|---|---|
| 1 | 2021-01-20 13:59:26 | YES | 0 |
| 1 | 2021-01-20 14:01:27 | NO | 1 |
| 1 | 2021-01-20 14:03:21 | NO | 2 |
| 1 | 2021-01-20 14:07:29 | NO | 3 |
| 1 | 2021-01-20 14:09:22 | YES | 0 |
| 1 | 2021-01-20 14:11:26 | YES | 0 |
| 1 | 2021-01-20 14:13:30 | NO | 1 |
| 1 | 2021-01-20 14:17:26 | NO | 2 |
| 1 | 2021-01-20 14:19:29 | YES | 0 |
| 1 | 2021-01-20 14:25:30 | NO | 1 |
| 1 | 2021-01-20 14:27:23 | NO | 2 |
| 1 | 2021-01-20 14:31:23 | NO | 3 |
| 1 | 2021-01-20 14:35:27 | NO | 4 |
| 1 | 2021-01-20 14:39:24 | YES | 0 |
| 2 | 2021-01-20 14:39:24 | NO | 1 |
| 2 | 2021-01-20 14:47:28 | NO | 2 |
| 2 | 2021-01-20 14:49:22 | NO | 3 |
| 2 | 2021-01-20 14:51:25 | NO | 4 |
| 2 | 2021-01-20 14:53:29 | NO | 5 |
| 2 | 2021-01-20 14:55:22 | NO | 6 |
| 2 | 2021-01-20 14:57:22 | YES | 0 |
最终,我想知道每个用户的条纹有多长:
| user_id | streak length |
|---|---|
| 1 | 0 |
| 1 | 3 |
| 1 | 2 |
| 1 | 4 |
| 2 | 0 |
| 2 | 6 |
我可以使用LAG() 来查找“否”转换为“是”的位置,反之亦然,但我很难计算每个转换之间的行数。
【问题讨论】:
-
解释为每个 user_id 显示条纹长度 = 0 背后的逻辑
-
@eshirvana 这不是必需的,但我想至少展示一下可能的情况。如果用户有所有
YES响应,那么它们可以被完全排除在外,或者被记录为0的连续长度。
标签: sql presto gaps-and-islands