2014-02-07 17 views
0

我有一列浮動列表。所有我需要中位數(或第一個四分位數)的時候,我必須首先計算它,並在其他查詢中計算平均值,總和,記錄數等...(全部一起)。在同一個查詢中計算中位數

我的問題是:有沒有一種方法來計算中位數,平均數,總數,...在同一個查詢中?

+1

你是什麼意思「在相同的查詢」? –

+0

其實我認爲查詢太髒了。只是爲了找到中位數是很多代碼。如果查詢在WHERE中有很多子句,我需要使用WITH來簡化等等...正如你所看到的,它存在一個更好的解決方案(但只適用於SQL Server 2012) – Nizam

+0

Gordon Linoff建議一個適用於SQL SERVER 2005及更高版本的優雅解決方案。在這個解決方案中(同樣在我建議的方案中),你只需要在一個查詢中完成所有的過濾。 Jorge Campos給出的答案需要一個WITH,否則您需要重複所有篩選以子查詢a,b和x。 – Nizam

回答

1

你可以在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 
+0

我不知道。這比有兩個不同的查詢要優雅得多。主要是當你有很多的過濾。除此之外,它更具可讀性。 – Nizam

0

只需使用一個選擇的兩個選擇爲子選擇

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

+0

不夠好。如果我需要計算中位數,第一和第三四分位數,我需要三個子查詢來處理相同的數據。它封裝了相同的查詢,但仍然是不同的查詢。這種情況下,我有3個子查詢來實現我想要的結果(如果測試是巨大的話,這可能會非常昂貴) – Nizam

+0

我認爲沒有辦法做你想做的事情,因爲中值是一個特定的情況,你需要推出所有數據,然後找到中間位置。把它與一個綜合數據一起......我認爲這是不可能的。 –

0

我發現在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 
相關問題