SQL优先取MAX日期再取最大seq获取商品单条最新记录的查询问题
问题根因
现有查询的逻辑是分别取单个商品的全局最大日期、全局最大seq,要求记录同时满足两个条件,当两个最大值不在同一条记录上时,就会出现无结果的问题。比如你举的SKU 5356262的例子:最大日期是7/24/2021对应seq为1,而全局最大seq为3对应日期是6/2/2021,没有记录能同时匹配两个条件,自然返回空。
解决方案
推荐使用窗口函数ROW_NUMBER()实现按优先级排序取Top1的需求,逻辑更清晰,也避免多子查询匹配的问题,修正后的SQL如下:
SELECT item, exdt, seq, [M], [L], [OH] FROM ( -- 按商品分组,优先按日期降序、同日期按seq降序排序 SELECT item, cpp, exdt, seq, tvt_1 + tft_1 AS ttot_1, ROW_NUMBER() OVER ( PARTITION BY LTRIM(item) ORDER BY exdt DESC, seq DESC ) AS rn FROM dbo.sample123 ) AS p -- 仅取每个商品排序后的第一条记录,即最大日期下最大seq的记录 WHERE rn = 1 PIVOT ( SUM(ttot_1) FOR cpp IN ([M], [L], [OH]) ) AS pvtc
说明
- 窗口函数的
PARTITION BY LTRIM(item)和你原有逻辑的商品匹配规则完全一致 ORDER BY exdt DESC, seq DESC严格按照你要求的优先级排序:先取最大日期,同日期下再取最大seq- 同时修正了你原有SQL的几个语法问题:
SELECT *后缺失的FROM关键字、seq字段名拼写错误、PIVOT子句中多余的闭合方括号 - 如果存在同一商品同一最大日期下有多个相同最大seq的记录,需要返回全部符合条件的行,把
ROW_NUMBER()替换为RANK()即可。
内容的提问来源于stack exchange,提问作者DubsZ
相关产品推荐
相关产品推荐

