mysql 按兩欄位分組,取字段a所有子集的第一行

2021-10-06 18:56:49 字數 2563 閱讀 8893

假設我們有一張工單表,主要記錄了每個工單所屬的區劃,以及辦理的事項名稱。

現在想要統計出每個區劃內工單數最多的事項名稱。

首先根據區劃、事項名稱進行分組,並根據工單數量進行排序。

這樣分組之後其實只差一步,即過濾出每個區的第一條資料。

可以順著看,或者跳到方法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...