【问题标题】:How to group ranged values using SQL Server如何使用 SQL Server 对范围值进行分组
【发布时间】:2010-10-03 03:09:01
【问题描述】:

我有一个这样的值表

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

如您所见,第二个数字添加到第一个数字后,是序列中下一个数字之前的 1 个数字。最后一个数字不在范围内(不遵循直接顺序,如在下一个值中)。我需要的是一个可以输出这个的 CTE(是的,理想情况下)

978412, 472
981001, 20

第一行包含范围的起始编号,然后是其中节点的总和。下一行是下一个范围,在本例中与原始数据相同。

【问题讨论】:

  • 如果您按第一列排序,那么最后一个数字 ,因为它大于任何其他数字 (981001 > 978834)。 400是怎么变成472的?
  • 978412 是范围内的第一个数字,472 是该范围内的节点数(最后一个数字和第一个 - 最后一个数字之间的差为 978834+50)。
  • 我相信有关于这种查询的文章,它的“称为岛屿和差距”..但我正在努力弄清楚它是如何完成的。

标签: sql-server tsql common-table-expression gaps-and-islands


【解决方案1】:

从 Josh 发布的文章中,这是我的看法(经过测试和工作):

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

【讨论】:

  • 根据文章基准,它应该是最快的基于集合的解决方案。
【解决方案2】:

看看这个MSDN Article。它为您的问题提供了一个解决方案,它是否适合您取决于您​​拥有的数据量和您对查询的性能要求。

编辑:

使用查询中的示例,并使用他的最后一个解决方案获取岛的第二种方法(第一种方法导致 SQL 2005 出现错误)。

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。这会给你计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多