T-SQL中的中值

use*_*865 6 sql t-sql sql-server-2008

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

Total       Total

100         100
101         101
104.5       104.5
108         108
108.3       108.3
112         112
            114
Run Code Online (Sandbox Code Playgroud)

我写了这个查询,当行数为奇数时,它正在计算正确的中位数:

WITH    a AS ( SELECT   Total ,
                        ROW_NUMBER() OVER ( ORDER BY CAST(Total AS FLOAT) ASC ) rownumber
               FROM     [Table] A
             ),
        b AS ( SELECT TOP 2
                        Total ,
                        isodd
               FROM     ( SELECT TOP 50 PERCENT
                                    Total ,
                                    rownumber % 2 isodd
                          FROM      a
                          ORDER BY  CAST(Total AS FLOAT) ASC
                        ) a
               ORDER BY CAST(total AS FLOAT) DESC
             )
    SELECT  *
    FROM    b
Run Code Online (Sandbox Code Playgroud)

在两种情况下查找中位数的一般T-SQL查询是什么?就像行数是奇数的时候,当行数是偶数时?

我的查询可以被扭曲,以便它可以在偶数和奇数行情况下的中位数工作吗?

G M*_*ros 10

几年前我写了一篇关于Mean,Median和Mode的博客.我鼓励你阅读它.

使用SQL Server计算均值,中值和模式

SELECT ((
        SELECT TOP 1 Total
        FROM   (
                SELECT  TOP 50 PERCENT Total
                FROM    [TABLE] A
                WHERE   Total IS NOT NULL
                ORDER BY Total
                ) AS A
        ORDER BY Total DESC) +
        (
        SELECT TOP 1 Total
        FROM   (
                SELECT  TOP 50 PERCENT Total
                FROM    [TABLE] A
                WHERE   Total IS NOT NULL
                ORDER BY Total DESC
                ) AS A
        ORDER BY Total ASC)) / 2
Run Code Online (Sandbox Code Playgroud)


Luk*_*der 8

我知道您正在寻找适用于SQL Server 2008的解决方案,但是如果有人MEDIAN()在SQL Server 2012中寻找聚合函数,他们可以使用PERCENTILE_CONT()逆分布函数来模拟它:

WITH t(value) AS (
  SELECT 1   UNION ALL
  SELECT 2   UNION ALL
  SELECT 100 
)
SELECT DISTINCT
  percentile_cont(0.5) WITHIN GROUP (ORDER BY value) OVER (PARTITION BY 1)
FROM
  t;
Run Code Online (Sandbox Code Playgroud)

此处还记录了MEDIAN()via的仿真PERCENTILE_CONT().不幸的是,SQL Server仅支持此函数作为窗口函数,而不是像Oracle或PostgreSQL那样的常规有序集合函数.