根据从下一行开始的当前值对行进行分组

Dmi*_*sev 5 sql sql-server

我需要增加所有下一行的组号value <> z.z将意味着根据所有下一行将b具有相同的组号.

CREATE TABLE #tmp
(
    a CHAR(1)
  , b INT
);

INSERT INTO #tmp (a
                , b)
VALUES ('a', 1)
     , ('b', 2)
     , ('z', 3)
     , ('c', 4)
     , ('z', 5)
     , ('z', 6)
     , ('d', 7);

SELECT       t.a
           , t.b
           , SUM(v.is_z) OVER (ORDER BY t.b ROWS UNBOUNDED PRECEDING) - ROW_NUMBER() OVER (ORDER BY t.b) group_nbr
  FROM       #tmp                                                 AS t
 CROSS APPLY (SELECT CASE WHEN a = 'z' THEN 2 ELSE 1 END AS is_z) AS v
 ORDER BY 2;

DROP TABLE #tmp;
Run Code Online (Sandbox Code Playgroud)

在我的查询中,该组从具有值的行z开始递增,但我需要开始为下一行递增它.

预期产量:

在此输入图像描述

Gor*_*off 1

您希望“z”来标识组的结尾。您可以使用累积和来分配组编号。我认为这是做你想做的事情的最简单的方法。

如果您不关心数字的实际顺序,那么您可以简单地执行以下操作:

select t.*,
       sum(case when a = 'z' then 1 else 0 end) over (order by b desc) as grp_desc 
from #tmp t;
Run Code Online (Sandbox Code Playgroud)

如果您希望组以“正确的方式”编号,您可以使用稍微复杂的表达式:

select t.*,
       coalesce(sum(case when a = 'z' then 1 else 0 end) over
                    (order by b
                     rows between unbounded preceding and 1 preceding), 0
               ) as grp
from #tmp t;
Run Code Online (Sandbox Code Playgroud)

是一个 db<>fiddle。