我有一列浮動列表。所有我需要中位數(或第一個四分位數)的時候,我必須首先計算它,並在其他查詢中計算平均值,總和,記錄數等...(全部一起)。在同一個查詢中計算中位數
我的問題是:有沒有一種方法來計算中位數,平均數,總數,...在同一個查詢中?
我有一列浮動列表。所有我需要中位數(或第一個四分位數)的時候,我必須首先計算它,並在其他查詢中計算平均值,總和,記錄數等...(全部一起)。在同一個查詢中計算中位數
我的問題是:有沒有一種方法來計算中位數,平均數,總數,...在同一個查詢中?
你可以在SQL Server 2005及以上如下:
SELECT AVG(Salary) as AVERAGE,
MAX(case when seqnum = cnt/2 then salary end) as median,
MAX(SALARY) as MAXIMUM,
MIN(SALARY) as MINIMUM,
SUM(SALARY) as TOTAL,
TOTAL as NUMBER_OF_EMP
FROM (SELECT e.*,
count(*) over() as total,
row_number() over (order by salary) as seqnum
FROM TblEmployees e
) e
我不知道。這比有兩個不同的查詢要優雅得多。主要是當你有很多的過濾。除此之外,它更具可讀性。 – Nizam
只需使用一個選擇的兩個選擇爲子選擇
select * from
(select max(id) mx, min(id) mi, avg(id) av,
sum(id) sm
from test) a,
(select id as median from
(select id,
row_number() over (order by id) rownumber
from test) x
where rownumber = (select count(*) from test)/2) b
看到它在這裏小提琴:http://sqlfiddle.com/#!3/b9d60/6
不夠好。如果我需要計算中位數,第一和第三四分位數,我需要三個子查詢來處理相同的數據。它封裝了相同的查詢,但仍然是不同的查詢。這種情況下,我有3個子查詢來實現我想要的結果(如果測試是巨大的話,這可能會非常昂貴) – Nizam
我認爲沒有辦法做你想做的事情,因爲中值是一個特定的情況,你需要推出所有數據,然後找到中間位置。把它與一個綜合數據一起......我認爲這是不可能的。 –
我發現在SQL Server 2012中這個功能是我想要做什麼:
http://technet.microsoft.com/en-us/library/hh231327.aspx
我解決不了問題,只有一個查詢,但它比我之前所擁有的選項更乾淨。
看看這個功能例如:SQLFIDDLE
Supose我公司員工的薪酬表,我可以使用的功能:
SELECT
AVG(Salary) MEAN,
MAX(MEDIAN) MEDIAN,
MAX(SALARY) MAXIMUM,
MIN(SALARY) MINIMUM,
SUM(SALARY) TOTAL,
COUNT(*) NUMBER_OF_EMP
FROM (
SELECT *, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Salary) OVER() MEDIAN
FROM TblEmployees
) A
你是什麼意思「在相同的查詢」? –
其實我認爲查詢太髒了。只是爲了找到中位數是很多代碼。如果查詢在WHERE中有很多子句,我需要使用WITH來簡化等等...正如你所看到的,它存在一個更好的解決方案(但只適用於SQL Server 2012) – Nizam
Gordon Linoff建議一個適用於SQL SERVER 2005及更高版本的優雅解決方案。在這個解決方案中(同樣在我建議的方案中),你只需要在一個查詢中完成所有的過濾。 Jorge Campos給出的答案需要一個WITH,否則您需要重複所有篩選以子查詢a,b和x。 – Nizam