【发布时间】:2021-04-23 10:02:09
【问题描述】:
对于开始的特定季节和年份,我必须得到下一个开始的季节和年份,例如对于 2021 年夏季,我应该获得 2021 年秋季,对于 2021 年冬季,我应该获得 2022 年春季。
“Seasons”表有“Order”列,表示一年中的季节顺序,如下所示:
| SeasonID | Order | Name |
|---|---|---|
| 1 | 1 | Spring |
| 2 | 2 | Summer |
| 3 | 3 | Autumn |
| 4 | 4 | Winter |
备注:“订单”列可能看起来多余,但这实际上是我遇到的问题的简化/改编版本,其中“订单”列是必要的。
我有一个以@Year 和@SeasonID 作为输入参数的存储过程。我必须在@FollowingSeasonID 和@FollowingYear 参数中获取以下季节/年份,稍后我将在存储过程中使用它们。我不确定我是否使用了最好的技术:
(...)
DECLARE @FollowingSeasonID int;
DECLARE @FollowingYear int;
if object_id('tempdb..#Years') is not null drop table #Years
CREATE TABLE #Years ([Year] int)
INSERT INTO #Years ([Year]) VALUES (@Year), (@Year + 1)
SELECT @FollowingSeasonID = FollowingSeasonID, @FollowingYear = FollowingYear
FROM
(SELECT SeasonID,
[Year],
LEAD(SeasonID) OVER (ORDER BY [Year], Order) AS FollowingSeasonID,
LEAD([Year]) OVER (ORDER BY [Year], Order) AS FollowingYear
FROM Seasons
CROSS JOIN #Years) t
WHERE SeasonID = @SeasonID AND [Year] = @Year
(...)
有没有更好的方法来做到这一点?是否可以在一个查询中实现?
我需要在多个存储过程/视图/...中使用这些值,所以如果是函数,我想提取那部分代码。标量值函数不能返回两个值,所以我必须创建一个表值函数(并且我必须使用表变量而不是临时表 #Years)。但是,有没有更好的方法来做到这一点,而不是让一个总是只返回一行的表值函数?
【问题讨论】:
标签: sql sql-server tsql user-defined-functions window-functions