Sql 是否将连续项放在一行中?

Sql 是否将连续项放在一行中?,sql,sql-server,Sql,Sql Server,我有一个类似这样的表,不知道如何编写查询来只检索连续项 部分 数字 身份证件 1. 1. 1. 1. 2. 1. 1. 3. 2. 1. 4. 1. 2. 5. 1. 2. 6. 2. 2. 7. 1. 2. 8. 1. 您可以使用CTE和密度等级来实现这一点: --setting up data DECLARE @t TABLE ( section int, number int, id int ) insert into @t values(1,1,1), (1,2,1), (1,3

我有一个类似这样的表,不知道如何编写查询来只检索连续项

部分 数字 身份证件 1. 1. 1. 1. 2. 1. 1. 3. 2. 1. 4. 1. 2. 5. 1. 2. 6. 2. 2. 7. 1. 2. 8. 1.
您可以使用CTE和密度等级来实现这一点:

--setting up data 
DECLARE @t TABLE
(
section int,
number int, 
id int
)

insert into @t
values(1,1,1),
(1,2,1),
(1,3,2),
(1,4,1),
(2,5,1),
(2,6,2),
(2,7,1),
(2,8,1)

--Query
;WITH cte
AS (
    SELECT SECTION,
       number,
       DR = number - DENSE_RANK() OVER(ORDER BY number)
    FROM @t
    WHERE id <> 2
    GROUP BY SECTION,
          number
)
SELECT SECTION,
    STUFF(
          (
             SELECT ', '+CASE
                          WHEN MIN(number) <> MAX(number)
                          THEN CAST(MIN(number) AS VARCHAR(MAX))+'-'+CAST(MAX(number) AS VARCHAR(MAX))
                          ELSE CAST(MAX(number) AS VARCHAR(MAX))
                       END
             FROM cte
             WHERE SECTION = Results.SECTION
             GROUP BY SECTION,
                       DR FOR XML PATH(''), TYPE
          ).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, ''
       ) AS Items
FROM cte Results
GROUP BY SECTION;

您可以使用CTE和密度等级来实现这一点:

--setting up data 
DECLARE @t TABLE
(
section int,
number int, 
id int
)

insert into @t
values(1,1,1),
(1,2,1),
(1,3,2),
(1,4,1),
(2,5,1),
(2,6,2),
(2,7,1),
(2,8,1)

--Query
;WITH cte
AS (
    SELECT SECTION,
       number,
       DR = number - DENSE_RANK() OVER(ORDER BY number)
    FROM @t
    WHERE id <> 2
    GROUP BY SECTION,
          number
)
SELECT SECTION,
    STUFF(
          (
             SELECT ', '+CASE
                          WHEN MIN(number) <> MAX(number)
                          THEN CAST(MIN(number) AS VARCHAR(MAX))+'-'+CAST(MAX(number) AS VARCHAR(MAX))
                          ELSE CAST(MAX(number) AS VARCHAR(MAX))
                       END
             FROM cte
             WHERE SECTION = Results.SECTION
             GROUP BY SECTION,
                       DR FOR XML PATH(''), TYPE
          ).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, ''
       ) AS Items
FROM cte Results
GROUP BY SECTION;

你试过光标或循环吗?这样看起来应该很简单。你试过光标或循环吗?看起来那样应该很容易。