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