gpt4 book ai didi

SQL - 对行进行分类

转载 作者:行者123 更新时间:2023-12-02 04:48:53 26 4
gpt4 key购买 nike

下面是我正在使用的结果集。我想要的是一个额外的列,将 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

最佳答案

一般情况下你可以这样做:

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

在您的情况下,即使没有 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;

不幸的是,在 SQL Server 2008 中,您不能使用窗口函数进行总计,在 SQL Server 2012 中,可以使用 sum([bool]) over(order by ranking) .

如果您的行数非常多,并且您的ranking 列是唯一/主键,您可以使用递归cte 方法——就像this answer 中的方法一样。 , 它是 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)

sql fiddle demo

关于SQL - 对行进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com