SQL - 对行进行分类

tad*_*nes 2 sql sql-server sql-server-2008-r2

以下是我正在使用的结果集.我想要的是一个额外的列,它将X行标识为相同.在我的结果集中,第1-4行是相同的(想要标记为1),第5-9行是相同的(标记为2); 第10行(标记为3)

这怎么可能只使用SQL?我似乎无法使用rank或dense_rank函数执行此操作.

ranking              diff        bool
-------------------- ----------- -----------
1                    0           0
2                    0           0
3                    0           0
4                    0           0
5                    54          1
6                    0           0
7                    0           0
8                    0           0
9                    0           0
10                   62          1
Run Code Online (Sandbox Code Playgroud)

Rom*_*kar 5

一般情况下,您可以这样做:

select
    t.ranking, t.[diff], t.[bool],
    dense_rank() over(order by c.cnt) as rnk
from Table1 as t
    outer apply (
        select count(*) as cnt
        from Table1 as t2
        where t2.ranking <= t.ranking and t2.[bool] = 1
    ) as c
Run Code Online (Sandbox Code Playgroud)

在您的情况下,即使没有dense_rank():

select
    t.ranking, t.[diff], t.[bool],
    c.cnt + 1 as rnk
from Table1 as t
    outer apply (
        select count(*) as cnt
        from Table1 as t2
        where t2.ranking <= t.ranking and t2.[bool] = 1
    ) as c;
Run Code Online (Sandbox Code Playgroud)

遗憾的是,在SQL Server 2008中,您无法使用窗口功能运行总计,在SQL Server 2012中可以使用它sum([bool]) over(order by ranking).

如果你有非常多的行,并且你的ranking列是唯一/主键,你可以使用递归cte方法 - 就像这个答案中的一个,它是SQL Server 2008 R2中最快的一个:

;with cte as
(
    select t.ranking, t.[diff], t.[bool], t.[bool] as rnk
    from Table1 as t
    where t.ranking = 1
    union all
    select t.ranking, t.[diff], t.[bool], t.[bool] + c.rnk as rnk
    from cte as c
        inner join Table1 as t on t.ranking = c.ranking + 1
)
select t.ranking, t.[diff], t.[bool], 1 + t.rnk
from cte as t
option (maxrecursion 0)
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo