gpt4 book ai didi

sql-server-2008 - 用于查找连续递增值的 T-SQL

转载 作者:行者123 更新时间:2023-12-05 01:36:13 26 4
gpt4 key购买 nike

假设我有以下非常简单的架构:

Create Table MyTable (
PrimaryKey int,
Column1 datetime.
Column2 int
)

我需要一个基于 Column1 对数据进行排序的查询,并查找前 10 个连续行,其中当前行中 Column2 的值大于前一行中 column2 的值。

最佳答案

Q用于获取排名值rn订购者 Column1 .如果 Column1 中存在联系,则在 PrimaryKey 中添加. C是一个递归 CTE,从 rn 排序的顶部开始循环递增 cc对于 Column2 的每个增加值.当 cc 时,它将中断递归达到 10。最后从 C 获取最后 10 行. where 子句处理没有 10 个连续递增值的情况。

with Q as
(
select PrimaryKey,
Column1,
Column2,
row_number() over(order by Column1, PrimaryKey) as rn
from MyTable
),
C as
(
select PrimaryKey,
Column1,
Column2,
rn,
1 as cc
from Q
where rn = 1
union all
select Q.PrimaryKey,
Q.Column1,
Q.Column2,
Q.rn,
case
when Q.Column2 > C.Column2 then C.cc + 1
else 1
end
from Q
inner join C
on Q.rn - 1 = C.rn
where C.cc < 10
)
select top 10 *
from C
where 10 in (select cc from C)
order by rn desc
option (maxrecursion 0)

版本 2
Martin Smith在评论中指出,上述查询的性能非常差。罪魁祸首是第一个 CTE。下面的版本使用表变量来保存排名行。 primary key关于 rn 的指令创建将在查询递归部分的连接中使用的索引。除了 table 变量,它的作用与上面相同。
declare @T table
(
PrimaryKey int,
Column1 datetime,
Column2 int,
rn int primary key
);

insert into @T
select PrimaryKey,
Column1,
Column2,
row_number() over(order by Column1, PrimaryKey) as rn
from MyTable;

with C as
(
select PrimaryKey,
Column1,
Column2,
rn,
1 as cc
from @T
where rn = 1
union all
select T.PrimaryKey,
T.Column1,
T.Column2,
T.rn,
case
when T.Column2 > C.Column2 then C.cc + 1
else 1
end
from @T as T
inner join C
on T.rn = C.rn + 1
where C.cc < 10
)
select top 10 *
from C
where 10 in (select cc from C)
order by rn desc
option (maxrecursion 0)

关于sql-server-2008 - 用于查找连续递增值的 T-SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8054374/

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