mysql 【變量+leetcode常見題】

一、mysql變量聲明與定義

有兩種使用方式:

1. 使用set

set @varname=999
或者
set @varname:=999

2. 使用select

由於select語句中,’=’表示比較,不是賦值的意思,故此種變量賦值只可以使用‘:=’
select @varname:=999
或者
select @varname:=字段名 from tablename where …….

二、實現成績排名

題目:編寫一個 SQL 查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
這裏寫圖片描述

1. 排名並列

select a.Score,(select count(distinct b.Score) from Scores b where a.Score<b.Score)+1 as Rank from Scores a order by Rank 

效果如下:
這裏寫圖片描述

2.排名不併列

select Score,(@row_num:=@row_num+1) as Rank from (
         select Score from Scores) t1,
        (select (@row_num := 0)) t2 order by Score DESC

效果如下:
這裏寫圖片描述

三、實現中位數

在學習和筆試的時候遇到過求中位數的問題,下面就總結一下

1. 一個數據一行,分組求中位數

數據如下:
這裏寫圖片描述

#定義兩個變量
set @rownumber:=0;#計數,同一分組出現的個數
set @median_group:=' ';#輔助計數,判斷是否爲同一分組
#代碼1,這裏還未涉及中位數,只是實現同一分組計數
select @rownumber:=(case when @median_group=a.gender then @rownumber+1 else 1 end) as count_of_group, @median_group:=gender as median_group, gender, heights,(select count(*) from heights as b where b.gender=a.gender) as total_of_gender from  heights  as a order by gender,heights;

成績計數
這裏寫圖片描述

#實現分組求中位數,format(num,x)將最後的成績控制在2個小數爲
#total_of_gender/2.0+1 和total_of_gender/2.0 是保證總數在奇數或者偶數的時候均適用
select median_group,format(avg(heights),2) as '成績中位數' from (select @rownumber:=(case when @median_group=a.gender then @rownumber+1 else 1 end) as count_of_group, @median_group:=gender as median_group, gender, heights,(select count(*) from heights as b where b.gender=a.gender) as total_of_gender from  heights  as a order by gender,heights) as c where c.count_of_group between total_of_gender/2.0 and total_of_gender/2.0+1 group by median_group;

成績中位數:
這裏寫圖片描述

取分組後的前幾條記錄

問題描述:leetcode185

select d.Name as Department,e.Name as Employee,e.Salary 
from Department d ,Employee e where 
(select count(distinct e2.Salary) 
from Employee e2 where e2.DepartmentId=e.DepartmentId and e2.Salary>e.Salary) <=2 
and d.Id=e.DepartmentId 
order by Department ASC,Salary desc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章