在产品和年份列表中,使用递归函数来包含前几年的产品
In a list of Product and Year, use a Recursive Function to Include products of previous years
这是我面临的问题的简化。它归结为一个 CTE,显示当前和前几年的产品列表。对于第一年(2018 年),它只会显示 2018 年的产品。第二年(2019年)会展示2019+2018年的产品等
我不知道 CTE 是否是最佳解决方案,但需要从某个地方开始。
预期结果:
year
product
2018
product2018A
2018
product2018B
2019
product2018A
2019
product2018B
2019
product2019
2020
product2018A
2020
product2018B
2020
product2019
2020
product2020A
2020
product2020B
尝试:
DECLARE @YearProduct TABLE(
[year] int,
product VARCHAR(20)
);
INSERT INTO @YearProduct
([year], product)
VALUES
('2018', 'product2018A'),
('2018', 'product2018B'),
('2019', 'product2019'),
('2020', 'product2020A'),
('2020', 'product2020B')
;WITH CTE AS(
SELECT [year], product
FROM @YearProduct
UNION ALL
SELECT yp.[year], yp.product
FROM @YearProduct yp
INNER JOIN CTE ON CTE.[year]+1 = (yp.[year] ) AND CTE.product = yp.product
)
SELECT * FROM CTE
递归cte才是正道。对于 LESS OR EQUAL TO
year
的产品,您想要的是 CROSS JOIN
和 year
table
SELECT Y.[year], P.product
FROM @YearProduct P
INNER JOIN
(
SELECT distinct [year]
FROM @YearProduct
) Y ON P.[year] <= Y.[year]
ORDER BY Y.[year]
这是我面临的问题的简化。它归结为一个 CTE,显示当前和前几年的产品列表。对于第一年(2018 年),它只会显示 2018 年的产品。第二年(2019年)会展示2019+2018年的产品等
我不知道 CTE 是否是最佳解决方案,但需要从某个地方开始。
预期结果:
year | product |
---|---|
2018 | product2018A |
2018 | product2018B |
2019 | product2018A |
2019 | product2018B |
2019 | product2019 |
2020 | product2018A |
2020 | product2018B |
2020 | product2019 |
2020 | product2020A |
2020 | product2020B |
尝试:
DECLARE @YearProduct TABLE(
[year] int,
product VARCHAR(20)
);
INSERT INTO @YearProduct
([year], product)
VALUES
('2018', 'product2018A'),
('2018', 'product2018B'),
('2019', 'product2019'),
('2020', 'product2020A'),
('2020', 'product2020B')
;WITH CTE AS(
SELECT [year], product
FROM @YearProduct
UNION ALL
SELECT yp.[year], yp.product
FROM @YearProduct yp
INNER JOIN CTE ON CTE.[year]+1 = (yp.[year] ) AND CTE.product = yp.product
)
SELECT * FROM CTE
递归cte才是正道。对于 LESS OR EQUAL TO
year
CROSS JOIN
和 year
table
SELECT Y.[year], P.product
FROM @YearProduct P
INNER JOIN
(
SELECT distinct [year]
FROM @YearProduct
) Y ON P.[year] <= Y.[year]
ORDER BY Y.[year]