我有一列带有序列。我需要按顺序查找差距并运行内容以在出现差距的地方创建单独的清单。我用最小和最大创建了一个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
答案 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