Sql 如何使用周数和年查找上一行

Sql 如何使用周数和年查找上一行,sql,sql-server,Sql,Sql Server,我有一个表,它有周数和年两列。每年的周数可能从0到52,现在的问题是,我必须根据当前更新值查找上一次更新,如周数和年份,例如,如果当前更新为2018年第17周,则查找上一次更新。可能是2017年第52周,也可能是2018年第15周。查询可以做什么呢 我试过这个: SELECT TOP(1) WEEKNUM AS WEEK,YEARNUM AS YEAR FROM UPDATE_TABLE WHERE (WEEKNUM < 22 and YEARNUM = 2019) or (YEARNU

我有一个表,它有周数和年两列。每年的周数可能从0到52,现在的问题是,我必须根据当前更新值查找上一次更新,如周数和年份,例如,如果当前更新为2018年第17周,则查找上一次更新。可能是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
选择前(1)周数为周,前一周为年
从更新表
其中(周数<22且Dearneum=2019)或(Dearneum<2019)
按周订购数量说明,按周订购数量说明
但由于只选择了不到2018年的年份,它至少失败了一部分

这是桌子

┌─────────┬─────────┐
│ 周数│ 渴望│
├─────────┼─────────┤
│ 28│ 2018│
│ 19│ 2018│
│ 17│ 2018│
│ 21│ 2018│
│ 21│ 2017│
│ 30│ 2017│
│ 31│ 2017│
│ 48│ 2017│
│ 49│ 2017│
│ 50│ 2017│
│ 51│ 2017│
│ 22│ 2019│
└─────────┴─────────┘

上面的查询返回这个结果

周年
51 2017

我期待的是

周年
28 2018年

这是系统中的最后一次更新。同样,如果我认为17 2018作为当前更新,我应该得到51,2017作为输出。
提示:周数可以小于或大于当前更新周,年可以是当前年或当前更新年之前的任何一年。

顺序
,并通过
WEEKNUM+(eargum*52)
作为单个派生列进行筛选,而不是尝试应用某种
和/或
逻辑


您还可以使用
ROW\u NUMBER()
创建基数列,以便轻松获取前一行。或者您可能会考虑使用
LAG()
函数。

您只是把
orderby
子句弄混了。先按年度订购,然后按周订购:

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;
选择前(1)周数为周,前一周为年
从更新表
其中(周数<22且Dearneum=2019)或(Dearneum<2019)
按Dearneum DESC、WEEKNUM DESC订购;

这将为您提供2019W22前一周的最后一次更新。

这显然是一个分配,而不是堆栈溢出。显示示例数据和查询生成的结果,然后解释您期望任何不同的原因。如果您需要帮助,我们需要更多详细信息。这是一个很好的起点@pzkpfw我不认为在课堂上问家庭作业问题有什么不对,只要不是“嘿,帮我做家庭作业”。你得到的结果是错误的,因为51>28。我已经发布了一个答案。谢谢你的帮助。有没有其他方法可以达到同样的效果。我的意思是不使用和/或。例如,任何子查询。如Tab所示,您可以将年和周组合在一起。他建议使用
WEEKNUM+(Dearneum*52)
,这会起作用。您还可以使用WEEKNUM+(eargnum*100)以提高可读性,或者使用字符串(
select cast(eargnum作为varchar)+'-'+cast(WEEKNUM作为varchar)
)。您甚至可以将其作为计算虚拟列添加到表中,或创建视图以方便访问。