我有一个表,其中一个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仍然是一个独立的区间。我正在处理大量数据,所以出于性能考虑,我不喜欢使用游标(这就是我之前正在做的,并且会使速度变慢很多)...What是实现这一目标的最好方法吗?我不是SQL专家,所以我不确定是否有可用的函数可以让这件事变得更容易,也不确定完成这一任务的最快方法是什么。
谢谢你的帮助。
发布于 2013-01-03 00:24:34
关键的观察结果是,一个数字序列减去另一个序列是一个常数。我们可以使用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
其余的只是聚合。
发布于 2013-01-03 00:27:57
使用CTE和递归的解决方案:
WITH CTE AS (
SELECT T.ID, T.NUMBER, T.NUMBER AS GRP
FROM T
LEFT OUTER JOIN T T2 ON T.ID = T2.ID AND T.NUMBER -1 = T2.NUMBER
WHERE T2.ID IS NULL
UNION ALL
SELECT T.ID, T.NUMBER, GRP
FROM CTE
INNER JOIN T
ON T.ID = CTE.ID AND T.NUMBER = CTE.NUMBER + 1
)
SELECT ID, MAX( NUMBER ), MIN(NUMBER)
FROM CTE
GROUP BY ID, GRP
发布于 2018-04-22 15:36:11
CREATE TABLE Table1
([ID] int, [Number] int)
;
INSERT INTO Table1
([ID], [Number])
VALUES
(1, 25),
(1, 26),
(1, 30),
(1, 24),
(2, 4),
(2, 8),
(2, 5)
;
select ID,
MIN(Number)
,(SELECT MIN(Number)
FROM (SELECT TOP 2 Number from Table1 WHERE ID =
T1.Id ORDER BY Number DESC) as DT)
from Table1 as T1
GROUP BY ID
UNION
SELECT ID, MAX(Number), MAX(Number)
FROM Table1 as T1
GROUP BY ID;
https://stackoverflow.com/questions/14125297
复制相似问题