2011-09-05 91 views
1

對於偶數行式爲中位數是(104.5 + 108)/ 2對於下表和對於奇數行是108,用於表以下的平均在SQL Server 2000

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 

回答

1
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; 
3

如果你只想要一箇中位數,你可以使用這個簡單的查詢。

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

+0

你的意思是SELECT TOP 50%** **總不進球,對不對?除此之外,我認爲這真的很聰明。 – deutschZuid

+0

已編輯。感謝:D – NullCoder

+1

和MAX的:P ..另一件事你可能應該有/ 2.0而不是僅用整數2,以防萬一數學中涉及的所有操作數都是整數。 – deutschZuid