首页 > 解决方案 > Group By - 按每月满足的条件进行选择

问题描述

以下查询返回给定月份的所有USERS内容。SUM(AMOUNT) > 10它包括一个月内的用户,即使他们在其他月份不符合条件。

但我想转换此查询以返回所有USERS必须满足SUM(AMOUNT) > 10 每个月(即,从表中的第一个月到最后一个月)在整个数据中的条件的人。

换句话说,排除不是SUM(AMOUNT) > 10每个月都见面的用户。

select USERS, to_char(transaction_date, 'YYYY-MM') as month
from Table
GROUP BY USERS, month
HAVING SUM(AMOUNT) > 10;

标签: sqlpostgresql

解决方案


您需要将 > 10 的月数与最小日期和最大日期之间的月数进行比较:

SELECT users, Count(flag) AS months, Min(mth), Max(mth)
FROM
 (
   SELECT users, date_trunc('month',transaction_date) AS mth, 
      CASE WHEN Sum(amount) > 10 THEN 1 end AS flag
   FROM tab t
   GROUP BY users, mth
 ) AS dt
GROUP BY users  
HAVING -- adding the number of months > 10 to the min date and compare to max
   Min(mth) + (INTERVAL '1' MONTH * (Count(flag)-1)) = Max(mth)

如果错过的月份不算数,那将是一个简单的count(flag) = count(*)


推荐阅读