问题

Ftravel_id Facct_no Froute_code Fmodify_time
41010020180725102219102000010452 1359c027b0a15266418643239300118 4101001701E214 2018-07-25 10:22:19
41010020180725102749102000010453 1359c027b0a15266418643239300118 4101001701E214 2018-07-25 10:27:49
41010020180725103059102000010455 1359c027b0a15266418643239300119 4101001701E214 2018-07-25 10:30:59

这里的问题是如何得到指定时间范围内,指定 Facct_no 用户的 limit 个行程信息,返回行程序列按时间排序,且序列中每个 Froute_code 值都是唯一的,如果重复则取最新的一个。

因为 distinct 和 group by 都可以用来去重,这里总结下:

  • group by & distinct 的使用和区别
  • 去重时排序

去重 group by & distinct

group by 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

在 MySQL 中,不加聚合函数的情况下,返回的结果是分组后每组结果集中的第一行;选择的字段不必在 GROUP BY 中存在。

SELECT Ftravel_id,Facct_no FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code

对于标准 SQL 而言,GROUP BY 一定要结合聚合函数使用,而且选择的字段除了聚合函数外,还必须在 GROUP BY 中出现。如以下 SQL 语句:

SELECT Froute_code,count(Facct_no) FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code

如果在SELECT语句中使用GROUP BY子句,而不使用聚合函数,则GROUP BY子句的行为与DISTINCT子句类似。

SELECT Froute_code FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code

GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里;

多列情况下,GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里,也就是其中一个值不一样都会影响分组结果。

这里利用 group by 进行去重的原理是,不加聚合函数的情况下,返回的结果是分组后每组结果集中的第一行,这里是根据要去重的列进行分组的;比如按照 Froute_code 进行去重,则 SQL 是:

SELECT * FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code

返回的结果是分组后每组结果集中的第一行,导致重复 Froute_code 的行程信息可能会返回 Fmodify_time 较老的一条,我们是想返回重复 Froute_code 中最近的一条,Mysql 的 GROUP BY 没有排序功能。如果这样子呢:

SELECT * FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code ORDER BY Fmodify_time

增加 ORDER BY Fmodify_time,也没法实现去除的较老的,返回较新的 Froute_code 行程信息。因为 GROUP BY 会比 ORDER BY 先执行,没有办法在 GROUP BY 的各个 group 中进行针对某一列的排序。

只要在 GROUP BY 前将顺序调整好,把你希望的数据排在最前面,那么 GROUP BY 时就能顺利取到这个数据。故解决方法就是先进行你想要的排序,然后在此排序后的结果集的基础上,进行 GROUP BY 操作。比如下面 SQL:

SELECT *
FROM
(SELECT * FROM db_ccm_cx.t_ride_record_201807 ORDER BY Fmodify_time ) temp_table
GROUP BY Froute_code

另外,如果对输出的结果,想要排序的字段和 GROUP BY 字段一样,可以使用

[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]

比如,按照 Froute_code 进行排序:

SELECT *
FROM db_ccm_cx.t_ride_record_201807
GROUP BY Froute_code ASC

这个和显式使用 ORDER BY Froute_code ASC 含义一样,但 GROUP BY 在 ORDER BY 前进行,因此也无法实现对 GROUP BY 的各个 group 中进行针对某一列的排序。

distinct

关键词 DISTINCT 用于返回唯一不同的值。语法是:SELECT DISTINCT 列名称 FROM 表名称,比如以下 SQL:

SELECT DISTINCT Company FROM Orders

多列情况下,distinct 和 group by 一样,也是同时作用在了多个字段,多个字段组合一起不同的都会作为返回结果。比如以下 SQL:

SELECT DISTINCT Company,OrderPrice  FROM Orders

如果想返回多列,网上有一种错误的说法(见https://www.cnblogs.com/peijie-tech/p/3457777.html):因为 DISTINCT 单独使用如果不放在前面会报错,与其他函数使用时候,没有位置限制,所以可以使用下面 SQL,这样的返回结果多了一列无用的count数据:

SELECT Company, OrderPrice , COUNT(DISTINCT Company) FROM Orders

在 MYSQL 5.6 上是不行的,始终只返回 1列;

因此如果想返回多列,最好使用 group by 代替。

SELECT Company, OrderPrice  FROM Orders  GROUP BY Company

如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值。

可以使用具有聚合函数(例如SUM,AVG和COUNT)的DISTINCT子句中,在MySQL将聚合函数应用于结果集之前删除重复的行。

SELECT COUNT(DISTINCT Company) FROM Orders

如果要将DISTINCT子句与LIMIT子句一起使用,MySQL会在查找LIMIT子句中指定的唯一行数时立即停止搜索。

SELECT DISTINCT state FROM customers WHERE state IS NOT NULL LIMIT 3;

参考链接

https://segmentfault.com/a/1190000006821331

https://www.cnblogs.com/peijie-tech/p/3457777.html

https://www.yiibai.com/mysql/distinct.html

https://blog.csdn.net/PIGer920/article/details/7006420

https://blog.csdn.net/qbg19881206/article/details/8648991

https://dev.mysql.com/doc/refman/8.0/en/group-by-optimization.html

https://dev.mysql.com/doc/refman/5.5/en/select.html

group by搭配 order by解决排序问题的更多相关文章

  1. MySQL中group by 与 order by 一起使用排序问题

    假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id ) NOT NULL AUTO_INCREMENT, uid ) NOT NULL CO ...

  2. 深度分析mysql GROUP BY 与 ORDER BY

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQLi ...

  3. mysql GROUP BY 与 ORDER BY 查询不是最新记录

    转载:http://blog.csdn.net/qvbfndcwy/article/details/7200910 鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,( ...

  4. mysql “group by ”与"order by"的研究--分类中最新的内容

    这两天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况这种需求,我想很多人都遇到过.下面是我模拟我的内容表我现在需要取出每个分类中最新的内容 select * from ...

  5. 转:深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...

  6. group by和order by的错误

    select  u.Col_Name from hs_user u left join ( select tuid,count(*) as 'col_sumtopic' from BBS_Topic ...

  7. mysql中group by和order by同时使用无效的替代方案

    前言 最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生.在此做个记录,以备不时之需. 需求 首先,看一下 ...

  8. SQL语句group by 与order by 执行顺序引发的一场“内斗”

    直入主题!看看下面这SQL会不会报错?如果报错应该是什么错误! --说明:黑色字体都是列SELECT application_id, index_num, num, amount FROM `cred ...

  9. 深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...

随机推荐

  1. 【状压dp】Bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛

    Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S ...

  2. Go语言中的面向对象

    前言 如果说最纯粹的面向对象语言,我觉得是Java无疑.而且Java语言的面向对象也是很直观,很容易理解的.class是基础,其他都是要写在class里的. 最近学习了Go语言,有了一些对比和思考.虽 ...

  3. 入门级 JAVA反射机制

    1.什么是反射? Java中的反射机制是Java语言的一个很重要的特性,是Java “动态性” 的重要体现.Java反射机制让我们在程序运行状态中,对于任意一个类,都能知道这个类的所有属性和方法:对于 ...

  4. 5G+边缘计算,着眼可见的未来

    在 2019 年 2 月巴塞罗那举办的 MWC(世界移动通讯大会)上,华为手机带来了一款超薄的 5G 折叠屏手机 Mate X.这款手机将折叠屏和 5G 结合在一起,引起了不少人的关注与舆论,而昂贵的 ...

  5. 一个C#程序员学习微信小程序的笔记

    客户端打开小程序的时候,就将代码包下载到本地进行解析,首先找到了根目录的 app.json ,知道了小程序的所有页面. 在这个Index页面就是我们的首页,客户端在启动的时候,将首页的代码装载进来,通 ...

  6. 《HelloGitHub》第 36 期

    公告 本期内容较多.本期共有 41 个项目:C# 项目(1),C++ 项目(1),CSS 项目(2),Go 项目(5),Java 项目(2),JavaScript 项目(5),Objective-C ...

  7. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  8. frp内网 穿透映射使内网svn可外网访问

    起因 公司svn目前部署在内网服务器上,现在想在家中也可以使用,因此需要外网访问内网的工具 经过 使用过几个产品: utools,一个小巧的windows下的工具,内网映射只是它的一个小功能,支持tc ...

  9. Cmake 学习笔记

    编写CMakeLists.txt   #在当前目录新建一个build目录,然后cd build:cmake .. #这样的好处是,可以将cmake生成的内容,和源码文件分离   #设置编译结果发布路径 ...

  10. Windows Server 2016-命令行方式管理Windows服务

    Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序. 这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显 ...