sql两种方法计算一列数的中位数
假设一张表your_table,只有一列数值your_column,求这列数值的中位数。
除了直接用PERCENTILE(your_column, 0.5)之外,有两种处理方法:
SELECT AVG(median_value) AS median FROM ( SELECT your_column AS median_value, ROW_NUMBER() OVER (ORDER BY your_column) AS row_asc, ROW_NUMBER() OVER (ORDER BY your_column DESC) AS row_desc FROM your_table ) AS subquery WHERE row_asc = row_desc OR row_asc + 1 = row_desc OR row_asc = row_desc + 1;
这个查询先为每行分配了两个排名(升序和降序),然后在子查询中计算中位数。最后,它筛选出排名相等或相差不超过 1 的行,并计算这些行的平均值作为中位数。
SELECT AVG(your_column) AS median FROM ( SELECT your_column, ROW_NUMBER() OVER (ORDER BY your_column) AS rownum, COUNT(*) OVER () AS total_rows FROM your_table ) AS subquery WHERE rownum = (total_rows + 1) / 2 OR rownum = (total_rows + 2) / 2;
这个查询首先使用窗口函数为每行分配一个排名(升序),并计算总行数。然后,它筛选出排名等于 (总行数 + 1) / 2
或 (总行数 + 2) / 2
的行,然后计算这些行的平均值,作为中位数。