2010-02-07 146 views
0

可能重複:
Function to Calculate Median in Sql ServerSQL函數來計算平均

我有包含兩個字段的表(更多,但不相關)。這些字段是價格和數量。我想找到這張表的幾個統計數據,其中中間價格調整爲數量。

今天我有一個基本慢的不是好看的函數,它將總數量除以2,然後按照價格排序記錄並從總數量中減去數量。當總量達到0時,我有我的中位數。

正如你所猜測的,這很慢...非常慢。我正在尋找如何使這個更好,更快,更超級的想法。

我使用MS SQL Express 2008的...

+0

被問了幾次才 的http:// stackoverflow.com/questions/1342898/function-to-calculate-median-in-sql-server – gbn 2010-02-07 16:32:30

+0

這不僅僅是一個柱子嗎?我無法弄清楚這與我的兩列問題有何關係。 – rozon 2010-02-07 16:37:28

回答

0

這至少應該只有兩個查詢,而不是一個循環做到這一點:

declare @total int 

select @total = sum(Quantity) from Products 

select top 1 p.Price 
from Products p 
order by abs((select sum(Quantity) from Products where Price < p.Price) - (@total/2)) 

爲包括外地在價格上與指標數量可能會以奇蹟的表現...

0

我不是靠近我的SQL框來挖掘OVER PARTITION的東西,但利用它應該做你想要的。看看這篇文章的SQL 2005節的例子:link text

0

這可能是我在過去的使用,而不用景色最好的一個:

SELECT AVG(DISTINCT Quantity) 
    FROM (SELECT F1.ID, F1.Quantity, 
     SUM(CASE WHEN F2.Quantity < F1.Quantity THEN 1 ELSE 0 END), 
     SUM(CASE WHEN F2.Quantity = F1.Quantity THEN 1 ELSE 0 END), 
     SUM(CASE WHEN F2.Quantity > F1.Quantity THEN 1 ELSE 0 END) 
     FROM [Table] as F1, [Table] as F2 
     GROUP BY F1.ID, F1.Quantity) AS Partitions (ID, Quantity, Lesser, Equal, Greater) 
    WHERE Lesser = Greater 
    OR (Lesser <= (SELECT COUNT(*) FROM [Table])/2.0 AND Greater <= (SELECT COUNT(*) FROM [Table])/2.0);