mysql 分組選擇與group_concat
在其他的資料庫中我們遇到分組選擇的問題時,比如在分組中計算前10名的平均分
我們可以使用row_number()over() 比較方便的得到。
但是在mysql中,問題就被拋了出來,因為mysql並沒有乙個rownum內建資料元組訪問方式。
在這裡我提供三種方式來嘗試解決
一.最基礎的union的方式,放棄分組,採用union方式將多條查詢的結果集放在一起做後續操作。 雖然我們可以在程式中預先獲取所有分組,迴圈拼湊sql語句,但是這依然是很繁瑣費時的,而且在目標需要分的組是海量的將會非常消耗系統資源。
二.使用採用子查詢的方式,
例子
在上述語句中使用了乙個子查詢(select count(*))得到乙個cnt數,這個數實際上是可以反映這條資料元組在他所在分組所排名名次的。
這種方式看似很美好,實際上子查詢的效率出奇的爛,我實際跑起來,感覺mysql5.6對這樣查詢並沒有多上優化,給每一條記錄給出乙個『偽排名值』,天知道有多浪費資源。
三.使用group_concat()與substring_index配合解決
例子select substring_index(group_concat(report_period order by report_period desc),',',1) 。。。
通過乙個額外的字段存放group_concat(),我們可以後續取出各個分組中對應排名的值,這可以算做一種化縱為橫。由於我們本來分組就要使用group by所以,group_concat()括號中的屬性如果與外部的group by的屬性一致並不會帶來明顯的開銷增加。
不過由於返回的並不直接是我們需要的元組,而是乙個排序屬性值所以需要,在外巢狀一層查詢
通常group_concat()作為乙個優秀的輔助方法幫助我們儲存分組操作中我們不在乎聚合統計值又無法忽略的字段,我們可以在多重場合下用到它。
本例中我們如果只是要一部分隨機資料,不需要有序的資料(例如最大的前n條),我們可以採用在內層查詢select中加入乙個隨機值,在外層查詢中加入對隨機值得排序結果來實現隨機取資料。
mysql 控制分組個數 MYSQL 按限制分組
有沒有一種簡單的方法可以將group by結果限制在前2位。以下查詢返回所有結果。使用 limit 2 將整個列表減少到僅前2個條目。select distinct rating name id markets,sum rating good good sum rating neutral neut...
mysql分組排名 mysql分組排名
1.建立表並寫入測試資料 create table tb rank score city varchar 20 score int insert into tb rank score values sz 89 insert into tb rank score values sz 76 insert...
mysql邏輯分組列和行 mysql邏輯分組行轉列
表名 row to column 表結構如下 sql直接查詢即可得如上結果 select from row to column 要達到查詢效果如下結構 正解sql如下即可 select name as 姓名 max case subject when 數學 then score end as 數學 ...