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