SQL查询WHERE条件异常及获取全SKU最大exdt/seq记录问题
问题根因
- 最初SQL返回多item记录的原因:WHERE条件仅过滤了
exdt、seq等于item=5343553对应的最大值,没有增加item='5343553'的过滤条件,所有符合该exdt、seq取值的记录都会被返回,和item无关。 - 修改后返回空值的原因:你取的是全表全局最大
exdt和全局最大seq,这两个值大概率不属于同一条记录,不存在同时满足两个条件的行,自然返回空。而且就算存在这样的行,也只能拿到全表唯一的一条记录,完全不符合你「每个sku对应自身max exdt/seq记录」的需求。
解决方案
推荐使用窗口函数按item分组取每个sku的目标记录,性能和可读性远优于你当前的子查询写法,修正后的完整SQL如下:
SELECT * FROM ( SELECT item, cpp, exdt, seq, tv_1 + tf_1 AS tt_1, -- 按item分组,先按exdt倒序、再按seq倒序排序,排名第一的就是当前item最大exdt+最大seq的记录 ROW_NUMBER() OVER (PARTITION BY item ORDER BY exdt DESC, seq DESC) AS rn FROM dbo.sample123 ) t WHERE rn = 1 -- 仅保留每个item的top1记录 PIVOT ( SUM(tt_1) FOR cpp IN ([M], [LL], [OH]) ) AS pvtc
补充说明
- 如果你的业务逻辑是优先取最大seq、再取最大exdt,调整窗口函数ORDER BY的字段顺序即可:
ORDER BY seq DESC, exdt DESC - 如果同一个item下存在多条符合「最大exdt+最大seq」的重复行需要全部保留,将
ROW_NUMBER替换为RANK或DENSE_RANK即可 - 你原SQL中的PIVOT语法存在括号遗漏问题,上述代码已经修正了该语法错误
内容的提问来源于stack exchange,提问作者DubsZ
相关产品推荐
相关产品推荐

