sql-server 在sql server中查找中值

lg40wkob  于 2022-10-31  发布在  SQL Server
关注(0)|答案(1)|浏览(313)

我需要找到一列的中值,并且需要将答案四舍五入到小数点后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,这使得答案是错误的。
我如何修正这两种方法中的任何一种,以便从表中得到一个中值,或者有其他的方法吗?

c3frrgcw

c3frrgcw1#

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

相关问题