SQL去重之distinct和group by的应用
遇到一个需求,要去重查出某张表的字段一和字段二,但是查出来的结果要按照表中记录的创建时间排序。
于是,第一时间就想到了使用distinct这个去重专用语法了:
1 select distinct col1, col2 from table1 order by create_date;
嗯,自我感觉良好,一运行,抛出了异常,因为select选出的结果中根本没有create_date这个字段,还用这个字段排序,那不就报错了吗,于是改为:
1 select distinct col1, col2, create_date from table1 order by create_date;
嗯,可以了,不报错了,但是查询出来的结果不符合要求!为什么?因为distinct是全字段去重查询的,也就是说在distinct后面加上create_date会时查询语句按照col1、col2、create_date这三个字段去重,只要有一个字段不同,就认为整条记录不同,而需求是筛选出col1、和col2不同的记录。
然后试一下使用group by这个语法进行去重,结果也是报错。
1 select col1, col2, create_date from table1 group by col1, col2 order by create_date
看来只能使用嵌套查询了,里层使用order by排序,再将结果集按照distinct进行筛选。
1 select distinct t.col1, t.col2 from
2 (
3 select col1, col2, create_date
4 from table1
5 order by create_date
6 ) t
结果,失败了,里层排序后在层再进行去重时排序被打乱,原来distinct在去重同时有数据库自己的一套排序规则,也就是说去重回伴随重新排序,并且排序规则对开发人员不可见。
总结,想按照去重后筛选字段之外的字段进行排序,无解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2018-01-04 在vim下按ctrl+s后界面卡住
2018-01-04 定时将应用日志移动到指定目录