SQL按照某一列数据去重并显示整行信息(以一列为基准去重)
总会碰到一些奇奇怪怪的需求,各种加字段阿、建视图阿等等,然后使用了group by 还是没有达到想要的结果,那咋办嘛。
0.需求背景
根据MLOT重复字段 取 TRANSACTIONTIME 最小时间的一列, (MLOT已经用过group by分组 order by排序)
所以我们可以用(ROWNUM)伪列函数 + (MAX)取最大值函数 || (MIN)取最小值函数配合 再次使用group by 分组
1.首先把问题表加上伪列(rownum)--记得根据你要分组的列排序一下
--表记得改你自己的-- 请参考 select rownum rn,a.* from 你的表 a /* Formatted on 2020/4/12 9:37:03 (QP5 v5.256.13226.35538) */ SELECT ROWNUM RN, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a
2.然后再根据用过伪列的sql当作一张表进行子查询
-- 子查询且分组 当然你也可以再GROUP BY MLOT 前面进行 where 筛选 /* Formatted on 2020/4/12 9:34:48 (QP5 v5.256.13226.35538) */ SELECT * FROM (SELECT ROWNUM rn, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a) B WHERE rn IN ( SELECT MIN (rn) FROM (SELECT ROWNUM rn, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a) B GROUP BY MLOT)
W.参考模板
/* Formatted on 2020/4/12 9:46:14 (QP5 v5.256.13226.35538) */ SELECT * FROM 你的表 WHERE 伪列名称 IN ( SELECT MAX (伪列名称) FROM 你的表 GROUP BY 你要分组的列) --也可以进行where 筛选
--首先table 表要有rownum伪列函数 并取个名称 这里我取的是rn select * from table where rn in (select Max(rn) from table group by mlot)
bug怎么这么多!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!