查詢每一個班級分數前四名的學生名字 函數
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