按组的第一个值对值进行分组

时间:2018-06-11 20:09:31

标签: sql sql-server tsql

我想按组的第一个值对值进行分组,但似乎我是盲目的。 示例表

COL_1     COL_2   COL_3        ROW_ID
A         AA      2017-01-01   1
A         BB      2017-01-05   2
A         BB      2017-01-21   3
A         AA      2017-01-22   4
A         BB      2017-01-23   5
A         BB      2017-01-24   6
B         AA      2017-01-01   7
B         BB      2017-01-05   8
B         BB      2017-01-22   9
B         AA      2017-01-24   10
C         BB      2017-01-01   11 

结果应如下所示

COL_1     COL_2   COL_3        ROW_ID  Group
A         AA      2017-01-01   1       1
A         BB      2017-01-05   2       1
A         BB      2017-01-21   3       1        
A         AA      2017-01-22   4       2
A         BB      2017-01-23   5       2
A         BB      2017-01-24   6       2
B         AA      2017-01-01   7       3
B         BB      2017-01-05   8       3
B         BB      2017-01-22   9       3
B         AA      2017-01-24   10      4
C         AA      2017-01-01   11      5

组的编号也可以是每个组的第一个ID的编号或任何其他名称,但必须是唯一的。 我不想使用游标,只需使用SQL-SERVER 2012及以上的简单T-SQL

我认为答案与LAG和PARTITION OVER有关,但没有找到解决方案......到目前为止

有什么想法吗? 干杯,亚历克斯

来自@Gordon的EDIT解决方案,只需稍加改动

select t.*,
  col_1 + '_' + CONVERT(VARCHAR,sum(case when col_2 = 'AA' then 1 else 0 end) over (order by rowid)) as grp
from t;

再次感谢戈登

2 个答案:

答案 0 :(得分:1)

rails active_storage:install上使用组大小的分组。

row_number

答案 1 :(得分:1)

如果我理解正确,您希望计算每个值的'AA'数。如果是这样的话:

select t.*,
      sum(case when col_2 = 'AA' then 1 else 0 end) over (partition by col_1 order by col3) as grp
from t;

我猜你想要为每个col_1分别设置不同的组。如果这不正确,那么:

select t.*,
      sum(case when col_2 = 'AA' then 1 else 0 end) over (order by rowid) as grp
from t;

如果你只想要3个小组,可以依赖row_id

select t.*, (1 + (rowid - 1)/3) as grp
from t;