Sql 查询以获取IDx中的IDy范围
我有两张桌子:A桌有点像 IDx Column A Column B Column C 表B类似于 IDy IDx Column D Column F 一个IDy只能在一个IDx下。但一个IDx可以包含许多田园诗。一个IDx中的IDY可能是连续的,也可能不是连续的 例如,表B可能是Sql 查询以获取IDx中的IDy范围,sql,Sql,我有两张桌子:A桌有点像 IDx Column A Column B Column C 表B类似于 IDy IDx Column D Column F 一个IDy只能在一个IDx下。但一个IDx可以包含许多田园诗。一个IDx中的IDY可能是连续的,也可能不是连续的 例如,表B可能是 IDy IDx | 6 10 | 5 10 | 17 10 | 8 10 | 9 10 | 18 10 | 27 10 | 38 10 | 39 10 |
IDy IDx |
6 10 |
5 10 |
17 10 |
8 10 |
9 10 |
18 10 |
27 10 |
38 10 |
39 10 |
7 10 |
40 12 |
37 10 |
36 20 |
... ...
如果用户给出的IDx为10,批大小为3,那么我应该返回IDx 10大于3的所有范围。对于这种情况,它应该返回
IDx RangeStart RangeEnd
10 5 9
10 37 39 (Since IDy 40 is for IDx 12 and IDy 36 is for IDx 20)
我想要达到的结果的最后一个灰色区域。例如,在原始表格(第一个灰色区域)中,对于IDx 10,它有4个连续范围,5-9、17-18、27、37-39。仅对于范围5-9和37-39,大小大于或等于批量大小3(用户输入)。因此,在结果中,它将范围开始、范围结束返回为(5、9和37 39) 我还不知道如何编写查询,我需要尽快运行查询。有什么建议吗
谢谢 如果我理解得很清楚,您正在尝试获取至少3个连续值的组。
由于没有指定您正在使用的SQLServer版本,我假定它是SQLServer 2012或更高版本。
在这种情况下,一种可能性是
WITH A AS (
SELECT IDx, IDy
, NextY = LEAD(IDy, 1, IDy)
OVER (Partition BY IDx ORDER BY IDy)
FROM tableB
), B AS (
SELECT IDx
, IDy
, NextY
, block = SUM(CASE WHEN IDy + 1 = NextY THEN 0 ELSE 1 END)
OVER (Partition BY IDx ORDER BY IDy)
FROM A
)
SELECT IDx
, RangeStart = Min(IDy)
, RangeEnd = Max(NextY)
FROM B
WHERE IDy + 1 = NextY
GROUP BY IDx, Block
HAVING Count(1) >= (3- 1)
CTE
的划分仅用于可读性。第一个
CTE
为同一IDx添加下一个IDy值的字段。第二个在表中创建排名,例如,对于所有具有顺序值的行,块将是相同的。
主查询使用秩对数据进行分组。由于第二行中的
MAX(NextY)
的值是序列中的第三个值,因为NextY是下一个值id IDy,因此具有的条件是2而不是3,WHERE
条件删除序列中断的行。我最清楚地看到,您还没有学习关系/SQL数据库的基本原理,这句话是:“表也没有排序”。表是一组可以以各种方式查询的值,它没有顺序。我建议你阅读一些基本的介绍和教程,你可能会发现这个问题很简单。你能解释一下你想要实现什么吗?什么是射程?什么是批次?元组的顺序对结果有什么影响?我想得到的结果中的最后一个灰色区域。例如,在原始表格(第一个灰色区域)中,对于IDx 10,它有4个连续范围,5-9、17-18、27、37-39。仅对于范围5-9和37-39,大小大于或等于批量大小3(用户输入)。因此,在结果中,它将范围开始、范围结束返回为(5、9和37 39)