sql-server - 在sql server中查找中位数

标签 sql-server median

我需要找到一列的中位数,答案需要四舍五入到小数点后 4 位。由于 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));

这个答案似乎很接近,但是通过将最小值和最大值相除,我最终损失了 0.0001,这使得答案错误。

为了从表格中获取中位数,我该如何修正我尝试执行此操作的任何一种方法。或者有其他方法吗?

最佳答案

我一直在阅读 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

关于sql-server - 在sql server中查找中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74235150/

相关文章:

r - R 中的箱线图,仅中位数可见

python - 当 inf 存在时, np.percentile 返回与 np.median 不同的中位数

sql-server - 在 modify() 方法中提供 xml 元素值

sql-server - SqlServer触发器可以推送到ActiveMQ吗

sql-server - Grails SQLServerException Microsoft数据库 'limit'附近的语法不正确

sql - 用MySQL计算中位数的简单方法

sql - "Where 0=1"会解析整个表还是只返回列名

html - 消除或翻译从 XML 文件导入的 SQL 中的 HTML 字符

mysql - Min、Max、Average 和 Count 分组到 15 分钟的 bin 中

algorithm - 如何在不存储列表的情况下计算或近似列表的中位数