一、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