T-SQL计算中位数时重复值未全部纳入的问题咨询
T-SQL中位数计算修正方案
问题出在你添加的GROUP BY ParishCode, ChangeDate, Listing_Price子句——它会将同一教区、同一日期下相同Listing_Price的房产行合并为一行,相当于丢失了重复价格的样本数据,导致PERCENTILE_CONT计算中位数时只考虑去重后的价格,结果自然出现偏差。
修正方法:移除不必要的GROUP BY
PERCENTILE_CONT是窗口函数,本身通过OVER (PARTITION BY ParishCode, ChangeDate)已经完成了按教区和日期的分组计算,不需要提前用GROUP BY聚合数据。直接基于原始房产级数据计算即可:
Medians AS ( SELECT ParishCode AS PAR21CD, ChangeDate AS 'Month Start', PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Listing_Price) OVER (PARTITION BY ParishCode, ChangeDate) AS Median_Rent FROM Joined )
优化:返回唯一的教区-日期中位数结果
如果需要每个教区+日期只返回一行中位数(避免原始数据行重复导致结果行重复),可以在外层查询添加DISTINCT:
SELECT DISTINCT PAR21CD, [Month Start], Median_Rent FROM Medians
或者直接合并为一个查询:
SELECT DISTINCT ParishCode AS PAR21CD, ChangeDate AS [Month Start], PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Listing_Price) OVER (PARTITION BY ParishCode, ChangeDate) AS Median_Rent FROM Joined
补充说明
如果需要离散型中位数(从现有价格中取实际值),可以替换为PERCENTILE_DISC(0.5),但核心逻辑一致:不要提前对Listing_Price做去重分组,确保所有房产样本都被纳入计算。
内容的提问来源于stack exchange,提问作者GlassShark1
相关产品推荐
相关产品推荐

