我需要找到一列的中值,并且需要将答案四舍五入到小数点后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,这使得答案是错误的。
我如何修正这两种方法中的任何一种,以便从表中得到一个中值,或者有其他的方法吗?
1条答案
按热度按时间c3frrgcw1#
我一直在阅读Itzik Ben-Gan的T-SQL查询,最近看到了BI部分。我相信这就是你想要的。这就是他解释如何获得中位数的方法。他称之为金融中位数。你的另一个选择是查看PERCENTILE_DISC,而不是PERCENTILE_CONT,如下所示。