我有下面的数字序列,每次下面的数字与前一个数字相差多于一个单位时,我想制作一组新的数字,即打破连续的间隔
表T
value
1
2
3
5
6
7
15
16
17
18
由连续间隔组成的组:
min max
1 3
5 7
15 18
我正在尝试使用dense_rank()函数对行进行编号,如下例所示,然后我将能够按rankNumber进行分组并获取MIN(值)和MAX(值),但我找不到模式在此函数的PARTITION BY子句中使用
value rankNumber
1 1
2 1
3 1
5 2
6 2
7 2
15 3
16 3
17 3
18 3
WITH T2 AS
(
SELECT value, LEAD(value) OVER(ORDER BY value) as nextValue
FROM T
)
SELECT value, DENSE_RANK()
OVER(PARTITION BY CASE WHEN nextValue - value > 1 THEN 1 ELSE 0 END ORDER BY value)
FROM T2
创建表格的代码:
CREATE TABLE t(
value INT
);
INSERT INTO t VALUES
(1), (2), (3), (5), (6), (7), (15), (16), (17), (18);
使用上述查询的当前输出:
value rankNumber
1 1
2 2
3 1
5 3
6 4
7 2
15 5
16 6
17 7
18 8
答案 0 :(得分:4)
您需要考虑某种方式将序列转换为相应的组。我刚刚在这里从其他用户那里学到了这个技巧。通过使用遍历所有记录的ROW_NUMBER
,您可以通过从该行号中减去同一记录上的value
来计算组密钥。如果values
是连续的,则减法结果不会发生变化(因此产生相同的组密钥)。否则,组密钥将跳转到下一个(较小)值。每次跳跃时,组密钥都会变小。
以下是查询:
select min(value) min, max(value) max
from (select value, ROW_NUMBER() over (order by value) - value as [key]
from t) v
group by [key]
order by min