有一张类似
的表格 Id Item
--------------------
1 xx
2 xx
3 xxx
4 xxx
5 xxx
6 xxxx
7 xxxx
我想根据字符串长度的总和将拆分项列分成几个组。如果组的最大长度(项目)为6,则结果为
Id Item GroupId
------------------------
1 xx 0
2 xx 0
3 xxx 1
4 xxx 1
5 xxx 2
6 xxxx 3
7 xxxx 4
使用游标或C#代码很容易实现它,但游标很慢,C#代码需要额外部署。我想知道它是否只能用T-SQL实现。
我已经尝试(SUM(LEN(item)) OVER(ORDER BY ID) - 1)/6 AS GroupId
,但它不能用于上面的Id = 6和Id = 7。
Id Item RunningSum GroupId
--------------------------------------
1 xx 2 0
2 xx 4 0
3 xxx 7 1
4 xxx 10 1
5 xxx 13 2
6 xxxx 17 2
7 xxxx 21 3
答案 0 :(得分:0)
我能够使用模数运算符来获得你想要的东西:
select id
, item
, sum(CaseMod) OVER (ORDER BY id) as GroupID
FROM (
select id
, item
, sum(len(item)) over (order by id) as RunTotal
, sum(len(item)) over (order by id) % 6 as Mod6
, CASE WHEN sum(len(item)) over (order by id) < 6 THEN 0
WHEN sum(len(item)) over (order by id) % 6 <> 0 THEN 1
ELSE 0 END AS CaseMod
from dbo.test
group by id, item
) x
GROUP BY id, item, CaseMod