我想按组的第一个值对值进行分组,但似乎我是盲目的。 示例表
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;
再次感谢戈登
答案 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;