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 值都是惟一的,若是重复则取最新的一个。html
由于 distinct 和 group by 均可以用来去重,这里总结下:mysql
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上咱们可使用 COUNT, SUM, AVG,等函数。sql
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
在 MySQL 中,不加聚合函数的状况下,返回的结果是分组后每组结果集中的第一行;选择的字段没必要在 GROUP BY 中存在。segmentfault
SELECT Ftravel_id,Facct_no FROM db_ccm_cx.t_ride_record_201807 GROUP BY Froute_code
对于标准 SQL 而言,GROUP BY 必定要结合聚合函数使用,并且选择的字段除了聚合函数外,还必须在 GROUP BY 中出现。如如下 SQL 语句:yii
SELECT Froute_code,count(Facct_no) FROM db_ccm_cx.t_ride_record_201807 GROUP BY Froute_code
若是在SELECT语句中使用GROUP BY子句,而不使用聚合函数,则GROUP BY子句的行为与DISTINCT子句相似。ide
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字段值的记录放到一个分组里,也就是其中一个值不同都会影响分组结果。.net
这里利用 group by 进行去重的原理是,不加聚合函数的状况下,返回的结果是分组后每组结果集中的第一行,这里是根据要去重的列进行分组的;好比按照 Froute_code 进行去重,则 SQL 是:code
SELECT * FROM db_ccm_cx.t_ride_record_201807 GROUP BY Froute_code
返回的结果是分组后每组结果集中的第一行,致使重复 Froute_code 的行程信息可能会返回 Fmodify_time 较老的一条,咱们是想返回重复 Froute_code 中最近的一条,Mysql 的 GROUP BY 没有排序功能。若是这样子呢:htm
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 用于返回惟一不一样的值。语法是: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;
http://www.javashuo.com/article/p-tuawgqri-bm.html
https://www.cnblogs.com/peijie-tech/p/3457777.html
https://www.yiibai.com/mysql/distinct.html
https://blog.csdn.net/PIGer920/article/details/7006420
http://www.javashuo.com/article/p-grnxcbnq-z.html
https://dev.mysql.com/doc/refman/8.0/en/group-by-optimization.html
https://dev.mysql.com/doc/refman/5.5/en/select.html