SQL生成基于父行的组号

时间:2017-03-31 18:17:45

标签: sql sql-server group-by

我这里有一个有序的表,Parent_Flag列告诉你哪一行是父级,后面的子级将放在同一个组中。 如何在SQL中创建desired_result列?

示例:

ID   Parent_Flag Desired_Result
001      P           1
001      C           1
001      C           1
002      P           2
002      C           2
002      P           3

1 个答案:

答案 0 :(得分:1)

对于SQL Server 2012 +:

使用条件聚合窗口函数sum()count()over()

注意:我在示例数据中添加了identity列,以获取行的顺序。

select *
  , grp = sum(case when Parent_flag = 'P' then 1 else 0 end) over (order by i)
  , cgrp = count(case when Parent_flag = 'P' then 1 end) over (order by i)
from t

rextester演示:http://rextester.com/SMLN40470

返回:

+---+-----+-------------+-----+------+
| i | id  | parent_flag | grp | cgrp |
+---+-----+-------------+-----+------+
| 1 | 001 | P           |   1 |    1 |
| 2 | 001 | C           |   1 |    1 |
| 3 | 001 | C           |   1 |    1 |
| 4 | 002 | P           |   2 |    2 |
| 5 | 002 | C           |   2 |    2 |
| 6 | 002 | P           |   3 |    3 |
+---+-----+-------------+-----+------+