在MSSQL2008,我试图采用经典的中位数查询如下计算一列数的中位数从公共表表达式:计算平均
WITH cte AS
(
SELECT number
FROM table
)
SELECT cte.*,
(SELECT
(SELECT (
(SELECT TOP 1 cte.number
FROM
(SELECT TOP 50 PERCENT cte.number
FROM cte
ORDER BY cte.number) AS medianSubquery1
ORDER BY cte.number DESC)
+
(SELECT TOP 1 cte.number
FROM
(SELECT TOP 50 PERCENT cte.number
FROM cte
ORDER BY cte.number DESC) AS medianSubquery2
ORDER BY cte.number ASC))/2)) AS median
FROM cte
ORDER BY cte.number
的结果集我得到的是以下几点:
NUMBER MEDIAN
x1 x1
x1 x1
x1 x1
x2 x2
x3 x3
换句话说,“中间”列是一样的“号码”一栏时,我希望中位数列是“X1”一路下跌。我使用类似的表达式来计算模式,它在相同的公用表表达式上工作正常。
我在查询中看到的唯一区别是在公用表表达式中添加了WHERE子句,我不确定WHERE子句应该做什么。 – Dan 2010-07-09 22:34:20
啊,我不明白指定CTE名称作为限定符有这种效果。在实践中,我使用两列进行制图,所以恒定的中值对于在第一个系列的中值处绘制横跨图表的第二个系列非常有用。 感谢您的帮助。 – Dan 2010-07-09 22:44:41
从技术上讲,输出不正确。 1023.50应该是中位数。因此,如果您有偶数行并需要进行除法,您是否不需要将Number转换为小数或浮点数(例如Number * 1.000)? – Thomas 2010-07-10 01:51:10