gpt4 book ai didi

sql - 将数字区间分成组

转载 作者:行者123 更新时间:2023-12-02 09:26:58 25 4
gpt4 key购买 nike

我有下面的数字序列,每当后面的数字与前一个值相差超过一个单位时,我想创建一组新的数字,即打破连续区间

表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

最佳答案

你需要想出一些办法把序列变成相应的组。我刚刚从这里的另一个用户那里学到了这个技巧。通过使用遍历所有记录的 ROW_NUMBER,您可以通过从该行号中减去同一记录上的 value 来计算组键。如果 values 是连续的,则减法结果不会发生变化(因此产生相同的组 key )。否则组键将跳到下一个(较小的)值。每跳一次,组 key 就会变小。

这里是查询:

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

关于sql - 将数字区间分成组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36952990/

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