mysql分組求topN詳解

2021-10-07 11:14:32 字數 3292 閱讀 4472

create table `test1` (

`id` int(11) not null auto_increment,

`name` varchar(20) default null,

`course` varchar(20) default null,

`score` int(11) default null,

primary key (`id`)

) engine=innodb auto_increment=10 default charset=utf8

insert into test1(name,course,score)

values

('張三','語文',80),

('李四','語文',90),

('王五','語文',93),

('張三','數學',77),

('李四','數學',68),

('王五','數學',99),

('張三','英語',90),

('李四','英語',50),

('王五','英語',89);

需求:查詢每門課程分數最高的學生以及成績

實現方法:可以通過自連線、子查詢來實現,如下

select a.name,a.course,a.score 

from test1 a join (select course,max(score) score from test1 group by course) b

on a.course=b.course and a.score=b.score;

select name,course,score 

from test1 a

where score=(select max(score) from test1 where a.course=test1.course);

或者

select name,course,score 

from test1 a

where not exists(select 1 from test1 where a.course=test1.course and a.score < test1.score);

或者

select name,course,score from test1 a

where 1 > (select count(*) from test1 where a.course=test1.course and test1.score > a.score);

需求:查詢每門課程前兩名的學生以及成績

實現方式:使用union all、自身左連線、子查詢、使用者變數等方式實現

(select name,course,score from test1 where course='語文' order by score desc limit 2)

union all

(select name,course,score from test1 where course='數學' order by score desc limit 2)

union all

(select name,course,score from test1 where course='英語' order by score desc limit 2);

分析下這個sql:

相關子查詢的特點就是子查詢依賴與外部查詢,在這裡面其實是 select * from test 已經先執行了一遍了,查出了所有的資料

然後相關子查詢針對每一行資料進行select count(*) from test1 where course=a.course and score>a.score

例如:第一行是張三,數學77,那麼相關子查詢做的工作就是找出test表所有課程是數學的行,查詢 張三,77|李四,68|王五,99

然後where條件score>77,查詢出王五,99,count=1,這時候外部條件2>1,符合。

第二行是李四,數學68,那麼相關子查詢做的工作就是找出test表所有課程是數學的行,查詢 張三,77|李四,68|王五,99

然後where條件score>68,查詢出張三,77,王五,99,count=2,這時候外部條件2>2,不符合。

第三行是王五,數學99,那麼相關子查詢做的工作就是找出test表所有課程是數學的行,查詢 張三,77|李四,68|王五,99

然後where條件score>99,沒有資料,這時候外部條件2>0,符合。

那麼就篩選出了數學最大的2個人,張三和王五。

其實這裡的子查詢就是找出和當前行型別能匹配上的比他大的有多少,沒有比他大的他就是最大

那麼找top1就是 1>(***),topn就是n>(***xx)

分組Top N 問題

今天面試,面試官給了這樣乙個場景 有兩張表,一張表存放車隊id,班組id,司機id 另一種表存放司機id,運營時間,運營里程 要查詢出7月份每個車隊每個班組裡的 top 3 這就要用到row number 函式 首先按需求建兩張表 create table demo of topn car comp...

Spark實現分組TopN

在許多資料中,都存在類別的資料,在一些功能中需要根據類別分別獲取前幾或後幾的資料,用於資料視覺化或異常資料預警。在這種情況下,實現分組topn就顯得非常重要了,因此,使用了spark聚合函式和排序演算法實現了分布式topn計算功能。計算分組topn 9 created by administrato...

hive 分組排序,topN

hive 分組排序,topn 語法格式 row number over partition by col1 order by col2 desc rank partition by 類似hive的建表,分割槽的意思 order by 排序,預設是公升序,加desc降序 rank 表示別名 表示根據c...