在前10行中查找SQL Server中的中位数

时间:2017-11-21 01:40:36

标签: sql sql-server

SELECT
    [RowAsc] AS RowAsc,
    [RowDesc] AS RowDesc,
    UnitRate 
FROM
    (SELECT TOP(10)
         JobName AS JobName, Client AS Client,
         AssetClass AS AssetClass, AssetType AS AssetType,    
         AssetSubType AS AssetSubType,
         Component AS Component, 
         ComponentType AS ComponentType, ComponentSubType AS ComponentSubType,
         UnitRate AS UnitRate,
         ROW_NUMBER() OVER (PARTITION BY JobName, Client, AssetClass, AssetType, AssetSubType, Component, ComponentType, ComponentSubType 
                            ORDER BY UnitRate ASC) AS [RowAsc],
         ROW_NUMBER() OVER (PARTITION BY JobName, Client, AssetClass, AssetType, AssetSubType, Component, ComponentType, ComponentSubType 
                            ORDER BY UnitRate DESC) AS [RowDesc]
     FROM 
         [dbo].[ReplaceCost_DirectCost_Details] rdd
     WHERE
         client = 'APV_Ballina_Shire_Council_Old'  
         AND UnitRate IS NOT NULL
         AND UnitRate <> 0) x
WHERE    
    RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)

我有这个脚本来获得UnitRate的中位数,但是它给了我错误的中位数结果。我有10行,想要得到10行的UnitRate的中位数。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

对于偶数行,您需要一种方法来返回一行。一种方法是avg()

Select avg(UnitRate)
from . . .

这是外部查询所需的全部内容。

答案 1 :(得分:0)

单独运行内部查询,并修改它直到得到正确的结果(我想说出你期望的结果,但这不一定正确)。允许优化该查询的过程向您显示您的期望是否正确。使用top 10约束运行它,不使用它来查看正在执行的操作,并可能添加一个order by子句,它将为您提供正确的top 10。一旦您正确地运行了内部查询并为您提供了正确的结果,请重新添加外部查询。

我怀疑并不是因为你错过了一个订单,而是你已经将top 10放在内部查询中而不是外部查询中。如果你想要的只是你指定的窗口属性的前10个单位费率中位数,你也可以尝试将top 10移动到外部查询。

如果没有更好地理解你的架构以及你想要得到什么,就不可能给你一个准确的答案,所以我很乐意给你一个方法作为答案......但是我想知道这是否应该是评论。