Sql 查询以获取IDx中的IDy范围

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 |

我有两张桌子: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 |
 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)