SQL查询实现返回每日同TicketID/Title的最后一行记录
需求说明
需要实现的数据库查询规则如下:
- 相同TicketID分布在不同日期时,不做去重处理
- 相同TicketID在同一天重复出现时,去除重复条目
- 同日同TicketID的重复记录中,仅保留当日ID最大(最后生成)的那条记录
原SQL存在的问题
原语句无法生效是因为三处逻辑/语法错误:
- 窗口函数语法错误:
row_number()的分区逻辑写法规整错误,要实现「同日同TicketID为一组」的分区,需要将Date和TicketID共同作为分区字段,不能在partition by子句内嵌套group by - 多余的全局分组:子查询中写的
GROUP BY Date属于无效逻辑,窗口函数计算时不需要额外全局分组,该语句会强制按日期聚合,丢失明细记录,直接破坏窗口函数的计算逻辑 - 别名大小写不匹配:子查询中定义的排序列别名是大写
TEMP,外层过滤条件写为Temp = 1,在大小写敏感的数据库实例中会直接报字段不存在的错误
修正后的SQL语句
SELECT ID, TicketID, Date, Title, Status FROM ( SELECT ID, TicketID, Date, Title, Status, ROW_NUMBER() OVER (PARTITION BY TicketID, Date ORDER BY ID DESC) AS temp FROM MyTableFruit ) t WHERE temp = 1 ORDER BY Date;
逻辑说明
PARTITION BY TicketID, Date:将数据按「日期+TicketID」两个维度切分窗口,跨日期的同TicketID会被分到不同窗口,不会被去重,匹配第一条规则ORDER BY ID DESC:每个窗口内的记录按ID倒序排列,ID最大(最后生成)的记录会被标记为行号1- 外层过滤
temp = 1仅保留每个分组里排序第一的记录,匹配第二、第三条去重规则 - 去掉了原语句里多余的内层
GROUP BY Date和无意义的1=1条件,执行效率更高
内容的提问来源于stack exchange,提问作者Dominik N
相关产品推荐
相关产品推荐

