在平常操做中分頁和分組比較多見,這裏主要講講分組排序的不一樣場景:mysql
1.row_number() over()sql
row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的)。 函數
Sql代碼
select t.*,row_number() over(partition by accno order by createDate) row_number from Test t
查詢結果以下:3d
你們能夠注意到ACCNO爲111的記錄有兩個相同的CREATEDATE,用row_number函數,他們的組內計數是連續惟一的,blog
2.rank() over()排序
rank()是跳躍排序,有兩個第二名時接下來就是第四名。it
rank的sql:
select t.*,rank() over(partition by accno order by createDate) rank from Test t
查詢結果:io
能夠發現相同CREATEDATE的兩條記錄是兩個第2時接下來就是第4.select
3.dense_rank() over()分頁
dense_rank()也是連續排序,有兩個第二名時仍然跟着第三名。
Sql代碼
select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t
查詢結果:
能夠發現相同CREATEDATE的兩個字段是兩個第2時接下來就是第3.
再好比有時會要求分組排序後分別取出各組內前多少的數據記錄(須要用到子查詢,先將數據進行分組排序,而後再分組排序後的數據中篩選符合條件的數據),sql以下:
Sql代碼
select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4
查詢結果以下:
-----mysql 分組
SELECT a.group, SUBSTR(GROUP_CONCAT(sort ORDER BY sort DESC) FROM 1 FOR 1) maxsort
FROM t_sort_g a
GROUP BY `group`;
SELECT * FROM t_sort_g a LEFT JOIN t_sort_g b ON b.`group` = a.`group` AND a.sort < b.sort WHERE b.sort is null ORDER BY a.`group`;