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的博客.我鼓励你阅读它.
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)
我知道您正在寻找适用于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那样的常规有序集合函数.
| 归档时间: |
|
| 查看次数: |
13457 次 |
| 最近记录: |