【问题标题】:Median in SQL Server 2000SQL Server 2000 中的中位数
【发布时间】:2011-09-05 15:57:32
【问题描述】:

对于偶数行,对于下表,中位数公式为 (104.5 + 108)/2,对于奇数行,对于下表,其为 108

Total       Total

100         100
101         101
104.5       104.5
108         108
108.3       108.3
112         112
            114

下面的代码在 SQL Server 2008 中有效,但在 SQL Server 2000 中无效,因为它不理解 row_number()over

我们如何更改较低的代码以使其在 SQL Server 2000 上工作?

select avg(Total) median from
(select Total, 
rnasc = row_number() over(order by Total),
rndesc = row_number() over(order by Total desc)
 from [Table] 
) b
where rnasc between rndesc - 1 and rndesc + 1

【问题讨论】:

    标签: sql tsql sql-server-2000


    【解决方案1】:

    如果你只想要一个中位数,你可以使用这个简单的查询。

    SELECT
    (
      (SELECT MAX(Total) FROM
        (SELECT TOP 50 PERCENT Total FROM [Table] ORDER BY Total) AS BottomHalf)
      +
      (SELECT MIN(Total) FROM
        (SELECT TOP 50 PERCENT Total FROM [Table] ORDER BY Total DESC) AS TopHalf)
    ) / 2.0 AS Median
    

    来源:Function to Calculate Median in Sql Server

    【讨论】:

    • 您的意思是 SELECT TOP 50 PERCENT Total 不是得分,对吧?除此之外,我认为这真的很聪明。
    • 还有 MAX 个:P.. 另一件事你可能应该有 / 2.0 而不是整数 2,以防数学中涉及的所有操作数都是整数。
    【解决方案2】:
    SELECT Median = AVG(Total) FROM 
    ( 
        SELECT Total FROM ( 
            SELECT TOP 1 Total = Total * 1.0 FROM 
            ( 
                SELECT TOP 50 PERCENT Total 
                FROM dbo.[Table] ORDER BY Total 
            ) AS sub_a 
            ORDER BY 1 DESC 
        ) AS sub_1 
        UNION ALL 
        SELECT Total FROM ( 
            SELECT TOP 1 Total = Total * 1.0 FROM 
            ( 
                SELECT TOP 50 PERCENT Total 
                FROM dbo.[Table] ORDER BY Total DESC 
            ) AS sub_b 
            ORDER BY 1 
        ) AS sub_2 
    ) AS median;
    

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2010-12-17
      • 2011-09-23
      • 2011-03-04
      • 2011-04-23
      相关资源
      最近更新 更多