我有包含兩個字段的表(更多,但不相關)。這些字段是價格和數量。我想找到這張表的幾個統計數據,其中中間價格調整爲數量。
今天我有一個基本慢的不是好看的函數,它將總數量除以2,然後按照價格排序記錄並從總數量中減去數量。當總量達到0時,我有我的中位數。
正如你所猜測的,這很慢...非常慢。我正在尋找如何使這個更好,更快,更超級的想法。
我使用MS SQL Express 2008的...
我有包含兩個字段的表(更多,但不相關)。這些字段是價格和數量。我想找到這張表的幾個統計數據,其中中間價格調整爲數量。
今天我有一個基本慢的不是好看的函數,它將總數量除以2,然後按照價格排序記錄並從總數量中減去數量。當總量達到0時,我有我的中位數。
正如你所猜測的,這很慢...非常慢。我正在尋找如何使這個更好,更快,更超級的想法。
我使用MS SQL Express 2008的...
這至少應該只有兩個查詢,而不是一個循環做到這一點:
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))
爲包括外地在價格上與指標數量可能會以奇蹟的表現...
我不是靠近我的SQL框來挖掘OVER PARTITION的東西,但利用它應該做你想要的。看看這篇文章的SQL 2005節的例子:link text
這可能是我在過去的使用,而不用景色最好的一個:
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);
被問了幾次才 的http:// stackoverflow.com/questions/1342898/function-to-calculate-median-in-sql-server – gbn 2010-02-07 16:32:30
這不僅僅是一個柱子嗎?我無法弄清楚這與我的兩列問題有何關係。 – rozon 2010-02-07 16:37:28