如何在T-SQL中基于每个项目长度的总和来拆分列表

时间:2014-12-10 05:55:11

标签: sql-server tsql

有一张类似

的表格
 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

1 个答案:

答案 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

这是SQL fiddle