gpt4 book ai didi

SQL - 对行进行分类

转载 作者:行者123 更新时间:2023-12-02 21:47:38 25 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 rating) 来实现 .

如果您的行数非常大,并且您的 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/

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