年份差距以显示Separte列表中的差距-SQL Server

时间:2018-06-28 17:15:48

标签: sql sql-server sequence

我有一列带有序列。我需要按顺序查找差距并运行内容以在出现差距的地方创建单独的清单。我用最小和最大创建了一个cte,可以与其他东西一起使用。。尽管如此,我无法弄清楚如何识别间隙。请协助。这是相同的数据:

CREATE TABLE Table1
(
    sku varchar(50), 
    year float, 
    make varchar(50),  
    model varchar(50),
    model2 varchar(50)
);

INSERT INTO Table1 (sku, year, make, model, model2)
VALUES ('AVS1234', '2000',  'Xbox', 'pilot', 'ex'),
       ('AVS1234', '2001',  'Xbox', 'pilot', 'ex'),
       ('AVS1234', '2014',  'Xbox', 'pilot', 'ex');

WITH firstpass AS
(
    SELECT
        sku,
        MIN(year) AS min,
        MAX(year) AS max,
        make, model, model2
    FROM
        Table1
    GROUP BY
        sku, make, model, model2
)
SELECT 
    sku,
    CAST([min] AS NVARCHAR(10)) + '-' + 
    CAST([max] AS NVARCHAR(10)) + ' ' + make + ' ' + model +
    STUFF((SELECT DISTINCT ', ' + COALESCE([model2], '') + ''
           FROM firstpass 
           WHERE sku = a.sku
           FOR XML PATH (''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 1, '') AS NamesList2,
    ROW_NUMBER() OVER (PARTITION BY sku ORDER BY sku asc) AS RowNum
FROM 
    firstpass AS a
GROUP BY 
    sku, [min], [max], make, model;

DROP TABLE table1

预期结果是

sku          Nameslist                  Row
-------------------------------------------
AVS1234      2000 - 2001 xbox Pilot ex  1
AVS1234      2014 xbox Pilot ex         2

1 个答案:

答案 0 :(得分:1)

这是一个经典的空白和空缺,

示例

Select SKU
      ,Nameslist = concat(
                   case when min(Year)<> max(Year) then concat(min(Year),' - ') end
                   ,max(year)
                   ,' '+max(make)
                   ,' '+max(model)
                   ,' '+max(model2)
                  )
 From (
         Select *
               ,Grp = Year - Row_Number() over (Partition by SKU order by Year)
          From  Table1
      ) A
 Group By SKU,Grp

返回

SKU        Nameslist
AVS1234    2000 - 2001 Xbox pilot ex
AVS1234    2014 Xbox pilot ex