如何使用周数和年

时间:2018-05-25 13:21:12

标签: sql sql-server

我的表有周数和年份两列。每周的周数可以是0到52,现在问题是我必须根据当前更新值找出先前的更新作为周数和年份,例如,如果当前更新是第17周 - 2018年那么找到之前的更新。它可能是2017年的第52周或2018年第15周。可能有什么问题要做。

我试过这个:

SELECT TOP(1) WEEKNUM AS WEEK,YEARNUM AS YEAR 
FROM UPDATE_TABLE
WHERE (WEEKNUM < 22 and YEARNUM = 2019) or (YEARNUM < 2019 ) 
ORDER BY WEEKNUM DESC,YEARNUM DESC

但在OR部分失败,因为只选择了少于2018年。

这是表格 ┌─────────┬─────────┐ │ weeknum │ yearnum │ ├─────────┼─────────┤ │ 28 │ 2018 │ │ 19 │ 2018 │ │ 17 │ 2018 │ │ 21 │ 2018 │ │ 21 │ 2017 │ │ 30 │ 2017 │ │ 31 │ 2017 │ │ 48 │ 2017 │ │ 49 │ 2017 │ │ 50 │ 2017 │ │ 51 │ 2017 │ │ 22 │ 2019 │ └─────────┴─────────┘

以上查询返回此结果

WEEK YEAR 51 2017

我期待的是

WEEK YEAR 28 2018

这是系统中的最后一次更新。同样,如果我将17 2018视为当前更新,我应该将51 2017作为输出。

提示:周数可能小于或大于当前更新周,年份可能是当前年份或当前更新年份之前的任何年份。

2 个答案:

答案 0 :(得分:1)

ORDER并按WEEKNUM + (YEARNUM * 52)过滤为单个派生列,而不是尝试应用某种AND/OR逻辑。

您也可以使用ROW_NUMBER()创建一个主要列,以便轻松获取上一行。或者您可以考虑使用LAG()函数。

答案 1 :(得分:1)

你只是把你的ORDER BY条款搞砸了。按年排序,然后按周排序:

SELECT TOP(1) WEEKNUM AS WEEK, YEARNUM AS YEAR 
FROM UPDATE_TABLE
WHERE (WEEKNUM < 22 and YEARNUM = 2019) or (YEARNUM < 2019 ) 
ORDER BY YEARNUM DESC, WEEKNUM DESC;

这应该是2019W22之前的最后一周更新。