统计分组数据中特定值(A)向其他值的转换次数
按ID分组统计"A"跳转为其他值的次数
现有包含ID和Values字段的表格,需按ID分组统计值"A"跳转为其他值的次数,具体示例如下:
原始数据
| ID | Values |
|---|---|
| 1 | A |
| 1 | A |
| 1 | A |
| 1 | B |
| 1 | A |
| 1 | B |
| 1 | B |
| 1 | C |
| 1 | C |
| 1 | C |
| 1 | A |
| 2 | A |
| 2 | A |
| 2 | B |
| 2 | A |
| 2 | B |
| 2 | C |
| 2 | B |
预期中间结果
| ID | Values | Desired Output |
|---|---|---|
| 1 | A | 0 |
| 1 | A | 0 |
| 1 | A | 1 |
| 1 | B | 0 |
| 1 | A | 1 |
| 1 | B | 0 |
| 1 | B | 0 |
| 1 | C | 0 |
| 1 | C | 0 |
| 1 | C | 0 |
| 1 | A | 0 |
| 2 | A | 0 |
| 2 | A | 1 |
| 2 | B | 0 |
| 2 | A | 1 |
| 2 | B | 0 |
| 2 | C | 0 |
| 2 | B | 0 |
最终统计结果
| ID | Number of Transitions |
|---|---|
| 1 | 2 |
| 2 | 2 |
实现方案(SQL示例)
通过窗口函数获取上一行的Values值,标记符合条件的跳转后分组求和即可:
WITH transition_marks AS ( SELECT ID, Values, CASE WHEN LAG(Values) OVER (PARTITION BY ID ORDER BY (SELECT NULL)) = 'A' AND Values != 'A' THEN 1 ELSE 0 END AS transition_flag FROM your_table ) SELECT ID, SUM(transition_flag) AS "Number of Transitions" FROM transition_marks GROUP BY ID;
说明
LAG(Values) OVER (PARTITION BY ID ORDER BY (SELECT NULL)):按ID分组,获取当前行的上一行Values值(若数据有明确排序字段,建议替换(SELECT NULL)为实际排序字段,保证顺序准确)CASE语句:标记「上一行是A且当前行不是A」的跳转场景,符合则记为1,否则为0- 最后按ID分组求和,得到每个ID的跳转总次数
内容的提问来源于stack exchange,提问作者user17760969
相关产品推荐
相关产品推荐

