如何在SQL中基于ID与direction字段实现精准Running Count
正确SQL实现方案
根据你的需求,核心是在同一id下,按direction分组、created_at排序,对OUTBOUND生成递增计数,INBOUND固定标记为1。以下是具体实现:
最终SQL代码
SELECT id, direction, created_at, -- 对OUTBOUND按时间生成递增行号,INBOUND固定返回1 CASE WHEN direction = 'OUTBOUND' THEN ROW_NUMBER() OVER (PARTITION BY id, direction ORDER BY created_at) ELSE 1 END AS running_count FROM your_table; -- 替换为你的数据表名
为什么你之前的尝试有问题
- 按
created_at和id分区:每个分区基本是单条数据,row_number()永远返回1,无法实现OUTBOUND的递增计数。 - 仅按
direction分区:会把所有不同id的同方向数据合并计数,不符合“同一id下”的范围要求。 - SUM写法报错:通常是因为窗口函数语法错误(比如缺少
ORDER BY、窗口范围定义错误),或者未正确匹配分区逻辑。
验证示例
假设你的测试数据如下:
| id | direction | created_at |
|---|---|---|
| 1 | OUTBOUND | 2024-01-01 10:00:00 |
| 1 | OUTBOUND | 2024-01-01 10:05:00 |
| 1 | INBOUND | 2024-01-01 10:10:00 |
| 1 | INBOUND | 2024-01-01 10:15:00 |
| 2 | OUTBOUND | 2024-01-01 09:00:00 |
执行上述SQL后得到的结果:
| id | direction | created_at | running_count |
|---|---|---|---|
| 1 | OUTBOUND | 2024-01-01 10:00:00 | 1 |
| 1 | OUTBOUND | 2024-01-01 10:05:00 | 2 |
| 1 | INBOUND | 2024-01-01 10:10:00 | 1 |
| 1 | INBOUND | 2024-01-01 10:15:00 | 1 |
| 2 | OUTBOUND | 2024-01-01 09:00:00 | 1 |
完全符合你预期的计数规则。
内容的提问来源于stack exchange,提问作者Juice_n_jingles
相关产品推荐
相关产品推荐

