【问题标题】:Median worked out incorrectly中位数计算不正确
【发布时间】:2015-03-20 08:20:55
【问题描述】:

我已经尝试了所有可能性来计算特定列的中值,但不断从 Excel 中获得不同的值。

我正在研究 SQL2008R2

这是我迄今为止尝试过的:

SELECT  Entity,
                BillPeriod,
                Cost,
                PatientDays,
                0 AS Median
        FROM GroupCTE
        UNION 
        SELECT  Entity,
                BillPeriod,
                Cost,
                PatientDays,
                0 AS Median
        FROM RegionCTE
                    UNION 
        SELECT  Entity,
                BillPeriod,
                Cost,
                PatientDays,
                0 AS Median
        FROM InstitutionCTE
        Union
        SELECT  'Median' as Entity,
                BillPeriod,
                0 as Cost,
                0 as PatientDays,
                (((
                    (SELECT MAX(Cost) FROM
                        (SELECT TOP 50 PERCENT Cost FROM InstitutionCTE WHERE Cost <> 0 ORDER BY Cost ASC) AS BottomHalf)
                    +
                    (SELECT MIN(Cost) FROM
                        (SELECT TOP 50 PERCENT Cost FROM InstitutionCTE WHERE Cost <> 0 ORDER BY Cost DESC) AS TopHalf)
                )) / 2)  AS Median

我在这里做错了什么吗?

我试过这个:Function to Calculate Median in Sql Server

谢谢

【问题讨论】:

  • 你可以看这个,Itzik Ben-Gan 给出了一些如何计算中位数的好例子:youtube.com/watch?v=goyWzAu-AA0
  • 此计算与中位数的定义不匹配。而 Excel 中位数函数可能正在实现中位数的确切公式。所以你会看到结果的不同。
  • (1) 提供一个计算不正确的例子。 (2) 如果cost是一个整数,那么你就是在做整数除法。
  • @GordonLinoff,与当前数据相比,与 SQL 结果相比,我得到了很大的不同:SQL - 401970.095 Excel - 397361.495。费用数据类型为浮点数。
  • 计算大于和小于这些值的值的数量,并找出哪个是正确的。

标签: sql sql-server sql-server-2008-r2 median


【解决方案1】:

所以我设法解决了这个问题。 问题是,由于某种原因,进行中位数计算得出的结果与 Excel 中位数函数的结果不同。

我创建了一个 TEMP 表并导入了我的 UNION 的结果,然后使用我的计算更新了 Median 列:

INSERT INTO #Temp
            SELECT  Entity,
                    BillPeriod,
                    ((Cost) / (PatientDays)) * 100 AS Cost,
                    PatientDays,
                    0 AS Median
            FROM GroupCTE
            UNION 
            SELECT  Entity,
                    BillPeriod,
                    ((Cost) / (PatientDays)) * 100 AS Cost,
                    PatientDays,
                    0 AS Median
            FROM RegionCTE
            UNION 
            SELECT  Entity,
                    BillPeriod,
                    ((Cost) / (PatientDays)) * 100 AS Cost,
                    PatientDays,
                    0 AS Median
            FROM InstitutionCTE
            UNION       
            SELECT  'Median' as Entity,
                    BillPeriod,
                    0 AS Cost,
                    0 AS PatientDays,
                    0 AS Median


            FROM InstitutionCTE
            GROUP BY Entity, BillPeriod, PatientDays

            UPDATE #Temp
            SET Median =    ((
                        ((SELECT MAX(Cost) FROM
                            (SELECT TOP 50 PERCENT Cost FROM #Temp WHERE Cost <> 0 ORDER BY Cost ASC) AS BottomHalf)
                        +
                        (SELECT MIN(Cost) FROM
                            (SELECT TOP 50 PERCENT Cost FROM #Temp WHERE Cost <> 0 ORDER BY Cost DESC) AS TopHalf)
                    )) / 2)     


SELECT * FROM #Temp
DROP TABLE #Temp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2021-11-25
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多