gpt4 book ai didi

sql - 根据表中的差距和年份值获取年份值列表

转载 作者:行者123 更新时间:2023-12-03 02:38:09 25 4
gpt4 key购买 nike

场景:我有一个包含 YearGap 列的表。我需要的输出是,从给定的年份值开始,它递增到间隙列中的值。

即,如果 YearVal 是 2001,并且 Gap 是 3,我需要的输出为

Result
--------
2001
2002
2003

我尝试过的:

DECLARE @ResultYears TABLE (Gap INT, YearVal INT);
INSERT INTO @ResultYears (Gap, YearVal) VALUES (3, 2001);

;WITH FinalResult AS (
SELECT YearVal AS [YR] FROM @ResultYears
UNION ALL
SELECT [YR] + 1 FROM FinalResult
WHERE [YR] + 1 <= (SELECT YearVal + (Gap -1) FROM @ResultYears)
)

SELECT * FROM FinalResult;

db<>fiddle demo表中只有一个条目。

使用上面的查询,我可以达到预期的结果。但如果表中有多个条目,则查询将不起作用。

即,如果我的表中有如下条目:

DECLARE @ResultYears TABLE (Gap INT, YearVal INT);

INSERT INTO @ResultYears (Gap, YearVal) VALUES
(3, 2001), (4, 2008), (1, 2014), (2, 2018);

如何修改查询以获得预期结果?

db<>fiddle demo表中包含多个条目。

最佳答案

这就是你想要的吗?

DECLARE @ResultYears TABLE (Gap INT, YearVal INT);

INSERT INTO @ResultYears (Gap, YearVal) VALUES
(3, 2001), (4, 2008), (1, 2014), (2, 2018);

WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS I
FROM N N1, N N2), --100 is more than enough
Years AS(
SELECT RY.YearVal + T.I AS [Year],
RY.Gap,
RY.YearVal
FROM @ResultYears RY
JOIN Tally T ON RY.Gap > T.I)
SELECT *
FROM Years Y
ORDER BY Y.YearVal;

我个人更喜欢计数表而不是 rCTE;它们的速度要快得多,尤其是在处理大型数据集时,或者在 rCTE 必须进行大量递归的情况下。

Demo on db<>fiddle

关于sql - 根据表中的差距和年份值获取年份值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56187275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com