我有一个包含 ID 列的表和另一个包含数字的列。一个ID可以有多个号码。例如
ID | Number
1 | 25
1 | 26
1 | 30
1 | 24
2 | 4
2 | 8
2 | 5
现在根据这些数据,在一个新表中,我想要这个
ID | Low | High
1 | 24 | 26
1 | 30 | 30
2 | 4 | 5
2 | 8 | 8
正如您所看到的,我想合并数字连续的任何数据,例如 24、25、26。所以现在最低价是 24,最高价是 26,然后 30 仍然是一个单独的范围。我正在处理大量数据,因此出于性能考虑,我宁愿不使用游标(这是我之前所做的,并且速度减慢了很多)...实现此目的的最佳方法是什么?我不是 SQL 专业人士,所以我不确定是否有可用的函数可以使这变得更容易,或者完成此操作的最快方法是什么。
谢谢您的帮助。
关键的观察是一个数字序列减去另一个序列是一个常数。我们可以使用生成另一个序列row_number
。这标识了所有组:
select id, MIN(number) as low, MAX(number) as high
from (select t.*,
(number - ROW_NUMBER() over (partition by id order by number) ) as groupnum
from t
) t
group by id, groupnum
剩下的只是聚合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)