資料分析常用sql
1、Mysql
coalesce(), with rollup
select coalesce(t.name,'總'),sum(t.v) from (select '小麗' as name,1 as v UNION ALL select '小麗' as name,2 as v ) t group by t.name with ROLLUP
分組top N 視窗函式裡不能用聚合函式
本篇介紹的三個函式均MySQL 8.x 以上版本,8.x以下版本會報語法錯誤,屬於正常現象。MySQL 8.x 實際上就是MySQL 5.8x,大概是為了通過更大版本型號數字,證明自己比友商先進吧。
欄位解釋:D2 商品分類,gmv,g_name 商品名稱
需求:求每個商品分類 gmv 銷售前N
步驟一: 計算彙總商品 GMV
SELECT sum( xgmv ) gmv, g_name, D2 FROM tb_tmp_name GROUP BY D2, g_name
步驟二:
rank() over (parition by D2 order by GMV DESC ) rn 組內排序
步驟二:
rank() over (parition by D2 order by GMV DESC ) rn 組內排序
SELECT t.*, rank() over ( PARTITION BY D2 ORDER BY gmv DESC ) rn FROM ( SELECT sum( xgmv ) gmv, g_name, D2 FROM tb_tmp_name GROUP BY D2, g_name ) t
步驟三:
rank() over (order by GMV DESC ) rn 整組排序,沒有Parition by 分組 那就預設一個數據組
整理如下:
SELECT *, ROW_NUMBER() over ( ORDER BY gmv DESC ) rnn FROM ( SELECT t.*, rank() over ( PARTITION BY D2 ORDER BY gmv DESC ) rn FROM ( SELECT sum( xgmv ) gmv, g_name, D2 FROM tb_tmp_name GROUP BY D2, g_name ) t ) n WHERE rn< 3 ORDER BY gmv DESC
最後效果如下:
1.2
RANK() OVER(業務邏輯)
作用:查出指定條件後的進行排名,條件相同排名相同,排名間斷不連續。
說明:例如學生排名,使用這個函式,成績相同的兩名是並列,下一位同學空出所佔的名次。即:1 1 3 4 5 5 7
DENSE_RANK() OVER(業務邏輯)
作用:查出指定條件後的進行排名,條件相同排名相同,排名間斷不連續。
說明:和rank() over 的作用相同,區別在於dense_rank() over 排名是密集連續的。例如學生排名,使用這個函式,成績相同的兩名是並列,下一位同學接著下一個名次。即:1 1 2 3 4 5 5 6
ROW_NUMBER() OVER(業務邏輯)
作用:查出指定條件後的進行排名,條件相同排名也不相同,排名間斷不連續。
說明:這個函式不需要考慮是否並列,即使根據條件查詢出來的數值相同也會進行連續排序。即:1 2 3 4 5 6
2、Presto
紙上得來終覺淺,絕知此事要躬行。