sql - 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;
解决方案
您需要将 > 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(*)
推荐阅读
- rest - 使用 groovy-wslite 从 CURL 请求发出 post 请求
- windows - 打开方式...上下文菜单,同名可执行文件的不同标签
- r - tidyverse 将几列除以 n 个位置后的其他列(避免循环)
- python - 在 python 中向 TCP 发送十六进制值的问题?
- java - 为什么我的数组的元素不能被正确解析?
- python - 使用 OR 时不匹配
- flutter - 为什么在具有另一个 setState 的子小部件内的回调中调用 setState 会破坏程序?
- ios - ld:找不到 -lRCTBlob 的库 clang:错误:链接器命令失败
- pywikibot - 如何使用环境变量中的密码登录 pywikibot?
- html - 使用内容调整表头大小