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 的行,然后计算这些行的平均值,作为中位数。

全部评论

相关推荐

不愿透露姓名的神秘牛友
04-23 19:42
点赞 评论 收藏
分享
03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
03-02 02:44
门头沟学院 Java
墨西哥大灰狼:说实话尚庭公寓还是尽量换了,全是增删改查没什么意义
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务