sql - 如何找到第一个最长的连续年份?
问题描述
微软 SQL 服务器 2017+
该表只有一列。
数据已经排序。
该列包含一些重复的年份。
请看下面的示例数据:
create table test1 (year int)
insert into test1 values
(1992), --1
(1993), --2
(1994), --3
(1995), --4
(1995), --4
(1997), --1
(1998), --2
(2000), --1
(2001), --2
(2002), --3
(2003), --4
(2003), --4
(2008) --1
预期结果:
1992
1993
1994
1995
请注意,2000-2003 年也有连续 4 年,但我只想要样本数据中第一个最长的 1992-1995 年。
解决方案
SQL 表表示无序集。除非列指定该排序,否则表不会排序。在您的情况下,该列似乎是year
.
我认为最简单的解决方案是连续一年。您可以通过从年份中减去一个序列号来找到这一点——差异的常数值表示年份的序列。
剩下的只是订购和select top
:
select top (1) min(year), max(year)
from (select t.*, dense_rank() over (order by year) as seqnum
from test1 t
) t
group by year - seqnum
order by max(year) - min(year) desc, min(year) asc;
这是一个 db<>fiddle。
获取原始行有点棘手。这是一种方法:
select top (1) with ties year, max(year) over (partition by year - seqnum) - min(year) over (partition by year - seqnum) as cnt
from (select t.*, dense_rank() over (order by year) as seqnum
from test1 t
) t
order by max(year) over (partition by year - seqnum) - min(year) over (partition by year - seqnum) desc,
min(year) over (partition by year - seqnum)
还有一个dbfiddle。
推荐阅读
- azure - 如何使用 powershell 脚本在 App Insights 上正确设置连续导出?
- excel - 在 Excel 中自动完成或建议
- java - Can not read JSESSIONID cookie after setting cookie-config to httpOnly and secure in web.xml
- angular - 如何将表格链接到Angular中的详细视图
- java - 如何检查为什么 JVM 无法终止
- html - Giving different wallpapers to a page
- elasticsearch - Elasticsearch delete_by_query 版本冲突
- ios - 构建 XCTest UI 测试套件的最佳实践是什么?
- r - Return value between two characters in a string
- css - 当flexbox旁边的div宽度增加时,如何避免flexbox中的项目不从div中出来?