假設我們有一張工單表,主要記錄了每個工單所屬的區劃,以及辦理的事項名稱。
現在想要統計出每個區劃內工單數最多的事項名稱。
首先根據區劃、事項名稱進行分組,並根據工單數量進行排序。
這樣分組之後其實只差一步,即過濾出每個區的第一條資料。
可以順著看,或者跳到方法2(較優思路)。
這樣就獲取到了每個區不同事項的最大工單數,再與上一步的結果集進行關聯即可得到最終結果。
select
t1.*from
(select
count(1
) cnt, item_name, region_name from work_order group
by item_name, region_name ) t1,
(select
region_name,
max( cnt ) mt
from
(select
count(1
) cnt, item_name, region_name from work_order group
by item_name, region_name ) t
group
by region_name
) t2
where
t1.cnt = t2.mt
and t1.region_name = t2.region_name;
最近有使用hive進行資料轉換,發現使用with…as…的寫法進行子查詢會比較易讀。(搜了下mysql8.0之後的版本也支援了這種寫法)
with base as
(select
count(1
) cnt, item_name, region_name
from work_order
group
by item_name, region_name
)select
t1.*from
base t1,
(select region_name,
max( cnt ) mt from base t group
by region_name ) t2
where
t1.cnt = t2.mt
and t1.region_name = t2.region_name;
還是在使用hive時發現了乙個不錯的語法,在初步思路的基礎上只用加一層就能得到最終結果。
select
*from
(select
row_number(
)over
(partition
by region_name order
by cnt desc
) rn,
*from
(select
count(1
) cnt, item_name, region_name from work_order group
by item_name, region_name ) t1
) t2
where
rn <
2;
用到了row_number這個函式獲取行數,並根據區劃分組,數量倒序排列,這樣每個分組下第一行就是我們要的結果。
目前mysql不支援這個函式,但可以通過自定義變數的方式達到類似的效果,後面有時間再補充。
其實上面的查詢方法感覺不夠優雅,等後面遇到更好的解決思路再來更新吧。
2020-06-04 補充方法2
mysql按關鍵符號擷取字段
比如以下字段內容,我要擷取以 為分割的部分內容 banner 2 1 png gcjx e extend uploadimg upload upload files 2020 07 02 9d2cba0773d47bad2cc8f8f36ee0a344.png 35231 banner 2.png ...
Mysql按欄位分組取最大值記錄
在實際工作中,我們經常碰到這樣的工作情況,取出使用者訂單中給定使用者的最大單筆購買金額,此時,可以用到mysql的按字段分組取最大值,操作如下 表 user order 結構如下,我的操作是取出uid對應的最大的buy time 方法0 select uid,max buy time from us...
mysql 將字段time按天 月 年分組
表中有乙個欄位time,格式為unix時間戳,現需要按照該欄位統計每天的記錄數並按天 月 年分組 假設表中有乙個欄位time,格式為unix時間戳,現需要按照該欄位統計每天的記錄數。方法 利用convert函式convert char 10 time,120 as time,然後group by t...