【问题标题】:SQL function to calculate median [duplicate]用于计算中位数的 SQL 函数
【发布时间】:2011-01-14 02:43:10
【问题描述】:

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

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

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

您可能猜到了,这很慢……非常慢。我正在寻找有关如何使这个更好、更快和更超级的想法的想法。

我使用 MS SQL Express 2008...

【问题讨论】:

标签: sql statistics


【解决方案1】:

这至少应该只用两个查询而不是一个循环来完成:

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))

以数量作为包含字段的价格索引可能会为性能带来奇迹......

【讨论】:

    【解决方案2】:

    我没有靠近我的 SQL 框来挖掘 OVER PARTITION 的东西,但是利用它应该可以满足您的需求。查看本文的 SQL 2005 部分以获取示例:link text

    【讨论】:

      【解决方案3】:

      这可能是我过去在不使用视图的情况下使用过的最好的一个:

      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);
      

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        相关资源
        最近更新 更多