Postgres:计算用户储蓄账户的月均存款次数
计算储蓄账户月均存款次数的SQL方案
你当前的SQL只是按月份分组提取了月份值,要得到单一的月均存款次数,得根据实际需求选择两种计算逻辑:
逻辑1:按账户生命周期内的所有自然月计算(包含无存款的月份)
如果要算从第一次存款到最后一次存款之间所有自然月的平均存款次数(哪怕某个月没有存款也计入统计),可以用下面的SQL:
WITH deposit_summary AS ( SELECT COUNT(*) AS total_deposits, DATE_TRUNC('month', MIN(timestamp)) AS first_month, DATE_TRUNC('month', MAX(timestamp)) AS last_month FROM savings_account_deposit WHERE user_id = :user_id AND savings_account_id = :savings_account_id ) SELECT total_deposits::FLOAT / ( (EXTRACT(YEAR FROM last_month) * 12 + EXTRACT(MONTH FROM last_month)) - (EXTRACT(YEAR FROM first_month) * 12 + EXTRACT(MONTH FROM first_month)) + 1 ) AS avg_monthly_deposits FROM deposit_summary;
说明:
- 先用
deposit_summary统计总存款次数、第一次和最后一次存款的月份(截断到当月第一天) - 通过将年月转换为“总月数”(年份×12+月份),计算两个日期之间的自然月总数(加1是为了包含首尾月份)
- 用总存款数除以总月数,转成
FLOAT避免整数除法导致的精度丢失
逻辑2:仅统计有存款的月份的平均次数
如果只需要计算有存款记录的月份的平均存款次数(忽略无存款的月份),SQL会更简洁:
SELECT COUNT(*)::FLOAT / COUNT(DISTINCT DATE_TRUNC('month', timestamp)) AS avg_monthly_deposits FROM savings_account_deposit WHERE user_id = :user_id AND savings_account_id = :savings_account_id;
说明:
COUNT(*)是该账户的总存款次数COUNT(DISTINCT DATE_TRUNC('month', timestamp))是有存款记录的不同月份数量- 两者相除得到每个有存款月份的平均存款次数
内容的提问来源于stack exchange,提问作者jordan
相关产品推荐
相关产品推荐

