2010-02-07 83 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);