我具有的值的这样一个表

978412, 400
978813, 20
978834, 50
981001, 20

正如你可以看到第二数目时添加到第一是前的序列中的下一个1号。最后一个号码不在范围(犯规遵循的一个直接序列,如在下一个值)。我需要的是一个CTE(是的,理想情况下),将输出这个

978412, 472
981001, 20

第一行包含该范围的开始编号,然后内的节点的总和。下一行是下一个范围在这个例子中是相同的原始数据。

有帮助吗?

解决方案

这是约什张贴的文章,这是我拿(测试工作):

SELECT
    MAX(t1.gapID) as gapID,
    t2.gapID-MAX(t1.gapID)+t2.gapSize as gapSize
    -- max(t1) is the specific lower bound of t2 because of the group by.
FROM
  ( -- t1 is the lower boundary of an island.
    SELECT gapID
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT *
        FROM gaps tbl2 
        WHERE tbl1.gapID = tbl2.gapID + tbl2.gapSize + 1
      )
  ) t1
  INNER JOIN ( -- t2 is the upper boundary of an island.
    SELECT gapID, gapSize
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT * FROM gaps tbl2 
        WHERE tbl2.gapID = tbl1.gapID + tbl1.gapSize + 1
      )
  ) t2 ON t1.gapID <= t2.gapID -- For all t1, we get all bigger t2 and opposite.
GROUP BY t2.gapID, t2.gapSize

其他提示

看看这个 MSDN文章。它给你一个解决问题的方法,它是否会为你工作,取决于你的数据的ammount的和查询性能要求。

编辑:

那么使用查询的例子,用他最后的解决方案去第二种方式获得的岛屿(第一种方式导致了2005年的SQL错误)。

SELECT MIN(start) AS  startGroup, endGroup, (endgroup-min(start) +1) as NumNodes
FROM (SELECT g1.gapID AS start,
(SELECT min(g2.gapID) FROM #gaps g2 
WHERE g2.gapID >= g1.gapID and NOT EXISTS
(SELECT * FROM #gaps g3 
WHERE g3.gapID - g2.gapID = 1)) as endGroup
FROM #gaps g1) T1 GROUP BY endGroup

我添加的一点是(endgroup-min(start) +1) as NumNodes。这会给你的计数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top