我的表有周数和年份两列。每周的周数可以是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作为输出。
提示:周数可能小于或大于当前更新周,年份可能是当前年份或当前更新年份之前的任何年份。
答案 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之前的最后一周更新。