衆數就是出現最多的那個數。mysql
select sal,count(*) as cnt from emp where DEPTNO=20 group by sal
經過分組把他們的行數計算出來。那麼最關鍵的部分在於,你如何知道最大值。
是的咱們能夠查出當前最大值,而後再取出最大值的sal。可是這確定要用到兩個臨時視圖。
注:咱們不能經過排序cnt,而後取值第一個,由於可能存在相同的行數。
解決方案:經過dense_rank 進行排序。sql
科普一下概念:函數
row_number的用途很是普遍,排序最好用它,它會爲查詢出來的每一行記錄生成一個序號,依次排序且不會重複,注意使用row_number函數時必需要用over子句選擇對某一列進行排序才能生成序號。 rank函數用於返回結果集的分區內每行的排名,行的排名是相關行以前的排名數加一。簡單來講rank函數就是對查詢出來的記錄進行排名,與row_number函數不一樣的是,rank函數考慮到了over子句中排序字段值相同的狀況,若是使用rank函數來生成序號,over子句中排序字段值相同的序號是同樣的,後面字段值不相同的序號將跳過相同的排名號排下一個,也就是相關行以前的排名數加一,能夠理解爲根據當前的記錄數生成序號,後面的記錄依此類推。 dense_rank函數的功能與rank函數相似,dense_rank函數在生成序號時是連續的,而rank函數生成的序號有可能不連續。dense_rank函數出現相同排名時,將不跳過相同排名號,rank值緊接上一次的rank值。在各個分組內,rank()是跳躍排序,有兩個第一名時接下來就是第三名,dense_rank()是連續排序,有兩個第一名時仍然跟着第二名。
答案:
sql servercode
select sal from( select sal,DENSE_RANK() over(order by cnt desc) as rnk from (select sal,count(*) as cnt from emp where DEPTNO=20 group by sal ) x) y where rnk=1
mysqlserver
select sal,count(*) as cnt from EMP where DEPTNO=20 group by sal HAVING COUNT(*)>=all( select count(*) from EMP where DEPTNO=20 group by sal )
由於mysql 沒有DENSE_RANK,因此只能經過大於等於全部值來完成。這樣就至關於查詢了兩遍。blog
這個比較簡單:
sql service排序
select avg(SAL) as sal from (select SAL,COUNT(*) over() total,CAST(COUNT(*) over() as decimal)/2 mid,CEILING((CAST(COUNT(*) over() as decimal)/2)) as next, ROW_NUMBER() over(order by sal) rn from emp where DEPTNO=20) x where (total%2=0 and rn in(mid,mid+1)) or (total%2=1 and rn=next)
可能看起來比較複雜,拆開來一下:ci
select SAL,COUNT(*) over() total,CAST(COUNT(*) over() as decimal)/2 mid,CEILING((CAST(COUNT(*) over() as decimal)/2)) as next, ROW_NUMBER() over(order by sal) rn from emp where DEPTNO=20
這樣就很清晰了。class
mysql:select
select avg(x.sal) FROM( select e.sal from EMP e,EMP d where e.deptno=d.deptno and e.deptno=20 GROUP BY e.SAL HAVING SUM(case when e.sal=d.sal then 1 else 0 end)>=abs(sum(sign(e.sal-d.SAL)))) x
一開始我也很懵逼,後來這樣:
select e.sal,SUM(case when e.sal=d.sal then 1 else 0 end),abs(sum(sign(e.sal-d.SAL))) from EMP e,EMP d where e.deptno=d.deptno and e.deptno=20 GROUP BY e.SAL
若是本身相同的數大於等於它左右兩邊差距數,那麼其是中位數。
其餘沒什麼值得注意的,就是算除法。
惟一值得關注的是:
若是是int類型,那麼應該轉換,再去計算。
CAST(x.d10 as decimal)