首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在没有游标的情况下合并单个SQL表中的数据

在没有游标的情况下合并单个SQL表中的数据
EN

Stack Overflow用户
提问于 2013-01-03 00:12:16
回答 3查看 1.8K关注 0票数 18

我有一个表,其中一个ID列,另一个列数字。一个ID可以有多个号码。例如

代码语言:javascript
复制
ID | Number
 1 |  25
 1 |  26
 1 |  30
 1 |  24
 2 |  4
 2 |  8
 2 |  5

现在,基于这个数据,在一个新的表中,我想要这个

代码语言:javascript
复制
ID | Low | High 
1  |  24 |  26
1  |  30 |  30
2  |  4  |  5
2  |  8  |  8

正如您所看到的,我希望合并任何数字连续的数据,如24、25、26。所以现在最低点是24,最高点是26,然后30仍然是一个独立的区间。我正在处理大量数据,所以出于性能考虑,我不喜欢使用游标(这就是我之前正在做的,并且会使速度变慢很多)...What是实现这一目标的最好方法吗?我不是SQL专家,所以我不确定是否有可用的函数可以让这件事变得更容易,也不确定完成这一任务的最快方法是什么。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-03 00:24:34

关键的观察结果是,一个数字序列减去另一个序列是一个常数。我们可以使用row_number生成另一个序列。这将标识所有组:

代码语言:javascript
复制
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

其余的只是聚合。

票数 36
EN

Stack Overflow用户

发布于 2013-01-03 00:27:57

使用CTE和递归的解决方案:

代码语言:javascript
复制
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

Results at fiddlesql

票数 3
EN

Stack Overflow用户

发布于 2018-04-22 15:36:11

代码语言:javascript
复制
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;

Live Example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14125297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档