如何从数字列表中创建数字范围?

时间:2014-05-09 00:30:27

标签: sql sql-server function

我想让我的结果在范围内(e:xx - xx),而不是列出每个数字(例如:XX,XX,XX,XX)

这是我用于示例的表格

表格

Doc   Pages
ABC   1
ABC   2
ABC   3
ABC   4
ABC   5
ABC   6
ABC   7
TEST  30
TEST  31
TEST  35
TEST  36
TEST  37
TEST  38
TEST  39
TEST  41
EFG   50
EFG   51
EFG   52
EFG   55

这是我用来获取结果的功能

功能

CREATE FUNCTION [dbo].[GetPagebyDoc]

(
@Doc varchar(50)
)

RETURNS varchar(max)
AS

BEGIN

      declare @output varchar(max)

      select @output = COALESCE(@output + ', ',' ') + pages
      from TABLE
      where doc = @doc

      return @output

END
GO

SELECT doc, dbo.GetPagebyDoc(doc)
FROM TABLE 
GROUP BY doc
GO

这是我的功能

的结果

结果

Doc   Pages
ABC   1, 2, 3, 4, 5, 6, 7
TEST  30, 31, 35, 36, 37, 38, 39, 41
EFG   50, 51, 52, 55

我需要帮助才能让我的结果看起来像这样。

我想要我的结果

Doc   Pages
ABC   1 - 7
TEST  30 - 31, 35 - 39, 41
EFG   50 - 52, 55

1 个答案:

答案 0 :(得分:0)

您正在尝试识别Islands and Gaps in Sequential Numbers,因此使用链接页面上的示例找到一个解决方案:

SELECT t1.Doc, t1.Pages as startOfGroup, MIN(t2.Pages) as endOfGroup
FROM (SELECT Doc, Pages FROM Table1 tbl1 
  WHERE NOT EXISTS(SELECT * FROM Table1 tbl2 
    WHERE tbl1.Pages - tbl2.Pages = 1)) t1
  INNER JOIN (SELECT Doc, Pages FROM Table1 tbl1 
  WHERE NOT EXISTS(SELECT * FROM Table1 tbl2 
    WHERE tbl2.Pages - tbl1.Pages = 1)) t2
  ON t1.Pages <= t2.Pages
GROUP BY t1.Doc, t1.Pages

SQL Fiddle

为了让结果看起来像你描述的那样,我会得到表示/应用层来重新格式化输出。