Sql 如何计算研究生的中位数?

Sql 如何计算研究生的中位数?,sql,postgresql,date,group-by,median,Sql,Postgresql,Date,Group By,Median,我已经创建了一个基本数据库(附图片),我正在尝试查找以下内容: “每个日历月每个用户花费的总金额中位数” 我尝试了以下操作,但出现错误: SELECT user_id, AVG(total_per_user) FROM (SELECT user_id, ROW_NUMBER() over (ORDER BY total_per_user DESC) AS desc_total, ROW_NUMBER() over (ORDER BY total_per_user

我已经创建了一个基本数据库(附图片),我正在尝试查找以下内容:

“每个日历月每个用户花费的总金额中位数”

我尝试了以下操作,但出现错误:

SELECT 
user_id,
AVG(total_per_user)
FROM (SELECT user_id,
        ROW_NUMBER() over (ORDER BY total_per_user DESC) AS desc_total,
        ROW_NUMBER() over (ORDER BY total_per_user ASC) AS asc_total
      FROM (SELECT EXTRACT(MONTH FROM created_at) AS calendar_month,
            user_id,    
            SUM(amount) AS total_per_user
            FROM transactions
            GROUP BY calendar_month, user_id) AS total_amount   
      ORDER BY user_id) AS a
WHERE asc_total IN (desc_total, desc_total+1, desc_total-1)
GROUP BY user_id
;

在Postgres中,您可以使用:


请注意,
date\u trunc()
可能比
extract(month from…
)更接近您想要的-除非您确实希望将同一月份不同年份的金额相加,这不是我理解您的要求的方式。

在Postgres中,您可以使用:

请注意,
date\u trunc()
可能比
extract(month from…
)更接近您想要的-除非您确实希望将同一月份不同年份的金额相加,这不是我理解您的要求的方式。

请使用。我不完全理解这个问题。如果您想要每月支出的中位数,那么:

SELECT user_id,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_per_user
        ROW_NUMBER() over (ORDER BY total_per_user DESC) AS desc_total,
        ROW_NUMBER() over (ORDER BY total_per_user ASC) AS asc_total
FROM (SELECT DATE_TRUNC('month', created_at) AS calendar_month,
             user_id, SUM(amount) AS total_per_user
      FROM transactions t
      GROUP BY calendar_month, user_id
     ) um   
GROUP BY user_id;
中位数有一个内置函数。无需特别处理。

只需使用即可。我不完全理解这个问题。如果您想要每月支出的中位数,那么:

SELECT user_id,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_per_user
        ROW_NUMBER() over (ORDER BY total_per_user DESC) AS desc_total,
        ROW_NUMBER() over (ORDER BY total_per_user ASC) AS asc_total
FROM (SELECT DATE_TRUNC('month', created_at) AS calendar_month,
             user_id, SUM(amount) AS total_per_user
      FROM transactions t
      GROUP BY calendar_month, user_id
     ) um   
GROUP BY user_id;

中位数有一个内置函数。不需要更高级的处理。

什么错误?如果你不告诉我们这个问题,我们就帮不了你。什么错误?如果你不告诉我们这个问题,我们帮不了你。