mysql分組排序

2021-09-24 20:05:49 字數 1603 閱讀 9592

sql的分組排序是乙個難點,在leetcode中是乙個hard級別的題目。筆者這兩天在工作中遇到了這麼乙個需求。取過去一段時間範圍內銷量前500的商品,然後取每個商品裡面銷量最高的sku,一共500個sku。取銷量前500的商品好求,但是這500對應的最高的sku不太容易,需要用到分組排序。筆者在工作中用的資料庫是mysql,有乙個特點,在先排序然後再分組會自動篩選出每一組的第一條記錄。因此筆者在這個專案中投了個巧,先對sku 銷量倒排,然後再對這個中間結果集進行分組,所得的結果即為每乙個商品的最大sku,完美也簡單。

但是如果是要求每組top2呢,因此在這個專案結束後特意取研究了一把分組排序。建立一張表用於分析:

然後往這個表中插入一批商品銷售資料,下面分兩個方向來討論分組排序。

1、分組取最大值(最小值)

比如,我需要根據上表中的資料來求每乙個product_id下面銷量最高的sku,則方法有:

1)根據sku_sales_count倒排,然後再根據product_id分組即可

select * from (select * from product_sale order by sku_quantity desc) group by product_id

2)使用自連線

原理就是通過子查詢中的分組取聚合函式max可以確定分組中的最大值,但不知道該最大值具體所在的行,要求得具體的行資訊,需要關聯原表查詢。

3)使用子查詢

4)用not exists

2、分組取top n

現在的需求不是求每乙個product_id下面銷量最高乙個的sku,而是要去銷量最高的多個sku,比如top 3,則解法有

1)使用union all

如果結果集很小,可以求出每乙個分組的top n,然後再用union all合起來。

2)左連線自己

這個思路是對於表中每個產品下的每條記錄統計在sku_quantity欄位上大於它的記錄,做鏈結,然後把匹配記錄行小於3的留下

3)自身子查詢

4)使用使用者變數

思路就是先對product_sale按product_id、sku_quantity進行排序,然後通過自定義變數對每乙個product_id下面的記錄從大到小進行編號,然後在最外層進行篩選出行號小於等於3的記錄。

MySQL分組排序

emp資料表建表語句 create table emp empno int,ename varchar 40 job varchar 40 mgr int,hiredate varchar 40 sal double,comm int,deptno int 插入資料準備 insert into em...

Mysql實現分組排序

資料 studenno studentname classno classname 2018140101 張三1401 14級一班 2018140111 孫一1402 14級二班 2018140121 李二1402 14級二班 2018140102 錢一1401 14級一班 2018140104 趙...

mysql 分組排序賦值

在實現介面平台功能時,有乙個這樣都場景 分組下的元素可以進行拖拽移動到該分組任意位置或者其他分組任意位置 每個分組下面所有的元素都有乙個排序序號,針對元素移動時 對原有分組下所有元素進行重新排序 對新加入對分組所有元素進行插入排序 為了更好對說明,我們建立一張這樣對錶 create table co...