zoukankan      html  css  js  c++  java
  • 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在去重同时有数据库自己的一套排序规则,也就是说去重回伴随重新排序,并且排序规则对开发人员不可见。

      总结,想按照去重后筛选字段之外的字段进行排序,无解。

  • 相关阅读:
    JavaScript链式调用
    Javascript设计模式(2)-单体模式
    Javascript设计模式(1)
    stm32结合产品学习01—产品的框架
    【目标检测-模型对比1】R-CNN、SPPnet、Fast R-CNN、Faster R-CNN的对比
    【目标检测-框架测试】mmdetection的安装与使用
    【机器学习-笔记1】吴恩达网课笔记1——机器学习策略
    【算法】P1004 方格取数
    【算法】UVa 11624, Fire! 解题心得
    vector
  • 原文地址:https://www.cnblogs.com/guanghe/p/10218628.html
Copyright © 2011-2022 走看看