在SQL Server中查找中位数。

3

我需要找到一列的中位数,并将答案四舍五入至小数点后四位。由于 SQL Server 没有 "MEDIAN()" 函数,因此我需要从列表的前50%中获取最小数字以及从底部50%中获取最大数字,然后除以2。

我尝试这样做:

SELECT(
    (SELECT CAST(ROUND(MAX(LAT_N), 4) AS DECIMAL(8, 4)) 
        FROM (SELECT TOP 50 PERCENT LAT_N FROM STATION ORDER BY LAT_N ASC) AS Bottom1)
    + (SELECT CAST(ROUND(MIN(LAT_N), 4) AS DECIMAL(8, 4))
        FROM (SELECT TOP 50 PERCENT LAT_N FROM STATION ORDER BY LAT_N DESC) AS Top1)) / 2;

但结果为5.323200而不是5.3232。

我还尝试了这个:

SELECT(
    (SELECT CAST(ROUND(MAX(LAT_N), 4) AS DECIMAL(8, 4)) 
        FROM (SELECT TOP 50 PERCENT (LAT_N / 2) AS LAT_N FROM STATION ORDER BY LAT_N ASC) AS Bottom1)
    + (SELECT CAST(ROUND(MIN(LAT_N), 4) AS DECIMAL(8, 4))
        FROM (SELECT TOP 50 PERCENT (LAT_N / 2) AS LAT_N FROM STATION ORDER BY LAT_N DESC) AS Top1));

这个答案似乎很接近,但通过将最小值和最大值都除以2,会导致丢失0.0001,从而使答案错误。

我该如何修正我正在尝试的方法中的任一种,以便从表格中获得中位数。还是有其他方法可以做到这一点?


1
“但结果是5.323200而不是5.3232。” 5.323200和5.3232是相同的值,所以你的意思是什么?如果你只想要精确到小数点后4位的值,那么可以使用适当比例的“CAST”/“CONVERT”转换为“decimal”。 - Thom A
根据SQL Server的版本,您可以安装“R”语言,然后在查询中使用它。这样,您就可以获得一个中位数函数。 - Grant Fritchey
1
SQL Server没有MEDIAN函数,但是它有PERCENTILE_CONT函数。中位数可以用PERCENTILE_CONT(0.5)来计算。 - Jeroen Mostert
@Larnu 我知道它们是相同的数字。问题在于我不是为自己的数据库做这个,而是在一个网站上练习,这个网站会把它当作错误。如你所见,使用CAST进行适当比例的转换已经完成,至少根据我的知识是这样的,这就是为什么我问是否有更好的方法使代码工作。 - Ineffable21
1个回答

3

我一直在阅读Itzik Ben-Gan的T-SQL查询,最近看到了BI部分。我认为这就是你想要的。他这样解释如何得到中位数。他称之为金融中位数。您的另一个选择是查看以下PERCENTILE_DISC而不是PERCENTILE_CONT。

CREATE TABLE #Test (
    [Id] INT IDENTITY(1,1) CONSTRAINT PK_Id PRIMARY KEY,
    [Cost] DECIMAL(19,4) NOT NULL
);

INSERT INTO #Test([Cost])
VALUES (5),(10),(15);

SELECT DISTINCT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY [Cost]) OVER () AS median
FROM #Test

1
谢谢,正是我所需要的,只需添加一个 Cast,这样我只能获得4位小数。 - Ineffable21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接