带拆分的T-SQL分组

带拆分的T-SQL分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想对连续的相似值进行分组。我想将第一个3个注册病房、一个ICU和最后一个3个注册病房分组。问题是第三组与第一组相同,我无法将它们单独分组。我尝试过窗口功能和其他功能,但都没有用。如果您有任何想法,我将不胜感激。谢谢 数据集 ID OccpdID Unit 1 1 Reg 1 2 Reg 1 3 Reg 1 4 ICU 1 5 Reg 1 6 Reg 1 7

我想对连续的相似值进行分组。我想将第一个3个注册病房、一个ICU和最后一个3个注册病房分组。问题是第三组与第一组相同,我无法将它们单独分组。我尝试过窗口功能和其他功能,但都没有用。如果您有任何想法,我将不胜感激。谢谢

数据集

ID  OccpdID   Unit
1     1       Reg
1     2       Reg
1     3       Reg
1     4       ICU
1     5       Reg
1     6       Reg
1     7       Reg
结果如下:

ID  OccpdID Unit    Group
1     1     Reg      1
1     2     Reg      1
1     3     Reg      1
1     4     ICU      2
1     5     Reg      3
1     6     Reg      3
1     7     Reg      3 
您可以尝试在带有SUMand CASE WHEN窗口函数的子查询中使用LAG

SELECT ID,OccpdID,Unit,SUM(CASE WHEN Unit <> prevVal THEN 1 ELSE 0 END) OVER(ORDER BY OccpdID) +1 as 'Group'
FROM (
    SELECT *, LAG(Unit) OVER(ORDER BY OccpdID) prevVal
    FROM Dataset
) t1

我不确定您希望如何/是否将ID纳入其中,但类似的内容将提供所需的结果:

SELECT
    ID
    , OccpdID
    , Unit
    , SUM(CASE WHEN Unit <> L OR L IS NULL THEN 1 ELSE 0 END) OVER (ORDER BY OccpdID) [Group]
FROM
    (
        SELECT
            ID
            , OccpdID
            , Unit
            , LAG(Unit, 1, NULL) OVER (ORDER BY OccpdID) L
        FROM YourTable
    ) Q
我将使用滞后和累积总和:

select t.*,
       sum(case when prev_unit = unit then 0 else 1 end) over (order by occpdid) as grp
from (select t.*, lag(t.unit) over (order by t.occpdid) as prev_unit
      from t
     ) t;

使用适当的软件MySQL、Oracle、DB2等标记数据库问题是很有帮助的。。。和版本,例如sql-server-2014。语法和特征的差异通常会影响答案。请注意,tsql缩小了选择范围,但没有指定数据库。谢谢,这一个对我有用。其他意见书也很好。我将从中吸取教训。感谢您的快速回复和时间……。@DonaldB没问题,很乐意帮助您,如果其他答案对您有帮助,您可以选择其他答案