mysql 查詢每組前幾條的數據,MySQL實現over partition by(分組後對組內數據排序)

         查詢每一個班級分數前四名的學生名字 函數

         SELECT
                t.class_id,
                SUBSTRING_INDEX(GROUP_CONCAT(
                    t.studet_name
                    ORDER BY
                        t.studet_score DESC
                ),',',4) RECORD
            FROM
                (
                    SELECT
                        a1.class_id,
                        a1.studet_name,
                        a1.studet_score
                    FROM
                        t_score a1
                ) t
            GROUP BY
                t.class_id.net

 

        查詢每一個班級分數前一名的學生名字 blog

           SELECT
                t.class_id,
                SUBSTRING_INDEX(GROUP_CONCAT(
                    t.studet_name
                    ORDER BY
                        t.studet_score DESC
                ),',',1) RECORD
            FROM
                (
                    SELECT
                        a1.class_id,
                        a1.studet_name,
                        a1.studet_score
                    FROM
                        t_score a1
                ) t
            GROUP BY
                t.class_id排序

 

 

 

本文連接:https://blog.csdn.net/m0_37797991/article/details/80511855
前言
開發中遇到了這樣一個需求:統計商品庫存,產品ID + 子產品名稱都相同時,能夠肯定是同一款商品。當商品來自不一樣的渠道時,咱們要統計每一個渠道中最大的那一個。若是在Oracle中能夠經過分析函數 OVER(PARTITION BY… ORDER BY…)來實現。在MySQL中應該怎麼來實現呢。如今經過兩種簡單的方式來實現這一需求。開發

數據準備產品

/*Table structure for table `product_stock` */
CREATE TABLE `product_stock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `product_id` varchar(10) DEFAULT NULL COMMENT '產品ID',
  `channel_type` int(11) DEFAULT NULL COMMENT '渠道類型',
  `branch` varchar(10) DEFAULT NULL COMMENT '子產品',
  `stock` int(11) DEFAULT NULL COMMENT '庫存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;table

/*Data for the table `product_stock` */class

insert  into `product_stock`
(`id`,`product_id`,`channel_type`,`branch`,`stock`) 
values (1,'P002',1,'豪華房',23),
(2,'P001',1,'高級標間',45),
(3,'P003',1,'高級標間',33),
(4,'P004',1,'經典房',65),
(5,'P003',1,'小型套房',45),
(6,'P002',2,'高級標間',331),
(7,'P005',2,'小型套房',223),
(8,'P001',1,'豪華房',99),
(9,'P002',3,'高級標間',65),
(10,'P003',2,'經典房',45),
(11,'P004',3,'標準雙牀房',67),
(12,'P005',2,'小型套房',34),
(13,'P001',1,'高級標間',43),
(14,'P002',3,'豪華房',56),
(15,'P001',3,'高級標間',77),
(16,'P005',2,'經典房',67),
(17,'P003',2,'高級標間',98),
(18,'P002',3,'經典房',23),
(19,'P004',2,'經典房',76),
(20,'P002',1,'小型套房',123);
————————————————
經過分組聚合GROUP_CONCAT實現
SELECT
  product_id,
  branch,
  GROUP_CONCAT(t.stock ORDER BY t.stock DESC ) stocks
FROM (SELECT *
      FROM product_stock) t
GROUP BY product_id,branch

查詢結果:channel

product_id    branch    stocks
P001    豪華房    99
P001    高級標間    77,45,43
P002    小型套房    123
P002    經典房    23
P002    豪華房    56,23
P002    高級標間    331,65
P003    小型套房    45
P003    經典房    45
P003    高級標間    98,33
P004    標準雙牀房    67
P004    經典房    76,65
P005    小型套房    223,34
P005    經典房    67
這也許並非咱們想要的結果,咱們只要stocks中的最大值就能夠,那麼咱們只要用SUBSTRING_INDEX函數截取一下就能夠:統計

SELECT
  product_id,
  branch,
  SUBSTRING_INDEX(GROUP_CONCAT(t.stock ORDER BY t.stock DESC ),',',1) stock
FROM (SELECT *
      FROM product_stock) t
GROUP BY product_id,branch
1
2
3
4
5
6
7
查詢結果:

product_id    branch    stock
P001    豪華房    99
P001    高級標間    77
P002    小型套房    123
P002    經典房    23
P002    豪華房    56
P002    高級標間    331
P003    小型套房    45
P003    經典房    45
P003    高級標間    98
P004    標準雙牀房    67
P004    經典房    76
P005    小型套房    223
P005    經典房    67
經過關聯查詢及COUNT函數實現
SELECT *
FROM (SELECT
        t.product_id,
        t.branch,
        t.stock,
        COUNT(*)     AS rank
      FROM product_stock t
        LEFT JOIN product_stock r
          ON t.product_id = r.product_id
            AND t.branch = r.branch
            AND t.stock <= r.stock
      GROUP BY t.id) s
WHERE s.rank = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
查詢結果:

product_id    branch    stock    rank P003    小型套房    45    1 P002    高級標間    331    1 P005    小型套房    223    1 P001    豪華房    99    1 P003    經典房    45    1 P004    標準雙牀房    67    1 P002    豪華房    56    1 P001    高級標間    77    1 P005    經典房    67    1 P003    高級標間    98    1 P002    經典房    23    1 P004    經典房    76    1 P002    小型套房    123    1 經過關聯表自己,聯接條件中:t.stock <= r.stock,當t.stock = r.stock時,COUNT出來的數量是1,當t.stock < r.stock時,COUNT出來的數量2,3,4…由此能夠給全部的數據根據stock字段作一個排序,而這個排序中全部爲1的,就是咱們所需求的數據,而後經過按id分組,獲得結果。經過這種方式,也能夠實現上面的需求。 ———————————————— 版權聲明:本文爲CSDN博主「MrCao傑羅爾德」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/m0_37797991/article/details/80511855

相關文章
相關標籤/搜索