SQL去重之distinct和groupby的应⽤
  遇到⼀个需求,要去重查出某张表的字段⼀和字段⼆,但是查出来的结果要按照表中记录的创建时间排序。
  于是,第⼀时间就想到了使⽤distinct这个去重专⽤语法了:
1select distinct col1, col2 from table1 order by create_date;
  嗯,⾃我感觉良好,⼀运⾏,抛出了异常,因为select选出的结果中根本没有create_date这个字段,还⽤这个字段排序,那不就报错了吗,于是改为:
1select distinct col1, col2, create_date from table1 order by create_date;
  嗯,可以了,不报错了,但是查询出来的结果不符合要求!为什么?因为distinct是全字段去重查询的,也就是说在distinct后⾯加上create_date会时查询语句按照col1、col2、create_date这三个字段去重,只要有⼀个字段不同,就认为整条记录不同,⽽需求是筛选出col1、和col2不同的记录。
  然后试⼀下使⽤group by这个语法进⾏去重,结果也是报错。
1select col1, col2, create_date from table1 group by col1, col2 order by create_date
  看来只能使⽤嵌套查询了,⾥层使⽤order by排序,再将结果集按照distinct进⾏筛选。
1select l1, t.col2 from
2(
distinct查询3select col1, col2, create_date
4from table1
5order by create_date
6 ) t
  结果,失败了,⾥层排序后在层再进⾏去重时排序被打乱,原来distinct在去重同时有数据库⾃⼰的⼀套排序规则,也就是说去重回伴随重新排序,并且排序规则对开发⼈员不可见。
  总结,想按照去重后筛选字段之外的字段进⾏排序,⽆解。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。