SQL函数计算中位数

时间:2010-02-07 16:29:32

标签: sql statistics

  

可能重复:
  Function to Calculate Median in Sql Server

我有一个包含两个字段的表(更多,但不相关)。字段是价格和数量。我想找到这个表的几个统计数据,其中包括调整到数量时的中位数价格。

今天我有一个基本 - 慢 - 不太好看的功能,它取总数量除以2.然后我走了按价格排序的记录并从总数量中减去数量。当总量达到0时,我有中位数。

你可能猜到,这很慢......很慢。我正在寻找有关如何使这更好,更快,更超级的想法。

我使用MS SQL Express 2008 ...

3 个答案:

答案 0 :(得分: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))

价格与数量作为包含字段的索引可能会对绩效产生奇迹......

答案 1 :(得分:0)

我不是靠近我的SQL框来挖掘OVER PARTITION的东西,但是利用它可以做你正在寻找的东西。查看本文的SQL 2005部分以获取示例:link text

答案 2 :(得分: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);