如何通过周数与年份查找数据库表中的上一条更新记录
解决按周数和年份查找上一条更新记录的问题
你的问题核心在于排序逻辑错误,导致查询优先按周数降序排列,忽略了年份的优先级,所以才会返回2017年第51周,而非你期望的2018年第28周。
原查询的问题分析
你写的ORDER BY WEEKNUM DESC,YEARNUM DESC会先按周数从大到小排序,再按年份排序。这意味着周数更大的旧年份记录(比如2017年的51周)会排在周数较小的新年份记录(比如2018年的28周)前面,完全不符合时间先后的逻辑。
正确的查询思路
我们需要先按年份降序排序(优先锁定最近的年份),再在同一年份内按周数降序排序(找该年份里最近的周)。同时筛选条件要精准:
- 要么年份小于当前年份,
- 要么年份等于当前年份且周数小于当前周数。
正确的SQL语句
假设当前要查询的是2019年第22周的上一条记录,你可以用以下语句:
DECLARE @current_year INT = 2019; DECLARE @current_week INT = 22; SELECT TOP(1) WEEKNUM AS WEEK, YEARNUM AS YEAR FROM UPDATE_TABLE WHERE (YEARNUM = @current_year AND WEEKNUM < @current_week) OR (YEARNUM < @current_year) ORDER BY YEARNUM DESC, WEEKNUM DESC;
结果验证
结合你提供的表数据:
- 当查询2019年22周时,筛选出2018年的所有周(28、19、17、21)和2017年的所有周。排序后2018年的记录排在最前面,其中最大的周数是28,返回
WEEK:28, YEAR:2018,符合你的期望。 - 当查询2018年17周时,筛选出的只有2017年的所有周,排序后最大的周数是51,返回
WEEK:51, YEAR:2017,也满足需求。
补充优化方案
如果你的数据库支持周数转日期的函数(比如SQL Server的DATEADD(wk, WEEKNUM-1, DATEFROMPARTS(YEARNUM, 1, 1))),还可以通过计算每条记录的实际日期来排序,逻辑更直观,兼容性也更强:
DECLARE @current_year INT = 2019; DECLARE @current_week INT = 22; DECLARE @current_date DATE = DATEADD(wk, @current_week-1, DATEFROMPARTS(@current_year, 1, 1)); SELECT TOP(1) WEEKNUM AS WEEK, YEARNUM AS YEAR FROM UPDATE_TABLE WHERE DATEADD(wk, WEEKNUM-1, DATEFROMPARTS(YEARNUM, 1, 1)) < @current_date ORDER BY DATEADD(wk, WEEKNUM-1, DATEFROMPARTS(YEARNUM, 1, 1)) DESC;
这种方式不需要纠结复合排序的逻辑,直接通过日期比较就能找到最近的上一条记录,尤其适合周数跨年的场景。
内容的提问来源于stack exchange,提问作者capnam
相关产品推荐
相关产品推荐

