sql - 选择在 PostgresQl 中每月至少支付一次成功和一次失败的用户
问题描述
如何从这种表中选择每月至少有一次付款成功和一次失败的用户?例如,如果用户在 3 月、4 月和 5 月有付款,并且在 5 月只有 10 次成功付款,我们不想显示该用户,但如果用户每个月有长达 10 个月的付款,则有失败(假)和成功(真)付款,我们想向该用户展示....
在这种情况下,我们只会显示用户 ID 为 1 和 3 的用户
现在我的查询看起来像这样:
SELECT DISTINCT date_trunc('month', paydate)as uniquemonth
, success
,user_id
FROM payments order by user_id,uniquemonth
解决方案
您可以计算付款失败和成功的不同月份:
select user_id
from t
group by user_id
having count(*) filter (where success) = count(*) and
count(*) filter (where not success) = count(*);
您似乎每个月只有一两条记录。如果您有更多并且第一列确实不是本月的第一列,您可以使用count(distinct)
:
select user_id
from t
group by user_id
having count(distinct date_trunc('month', uniquemonth)) filter (where success) = count(distinct date_trunc('month', uniquemonth)) and
count(distinct date_trunc('month', uniquemonth)) filter (where not success) = count(distinct date_trunc('month', uniquemonth))
推荐阅读
- javascript - Bootstrap Modal gets disappeared immidiately
- jquery - 输入更改时有条件地在按钮上显示文本
- java - 如何将文本发送到在 selenium webdriver 中使用自动完成功能的搜索框
- html - 使用 javascript 检查浏览器中对 shadow dom v1 的支持
- python - 使用 Boto3 从 AWS S3 读取 gzip 文件的内容
- spring-boot - 使用 Spring Boot RestTemplate-Client 提交 Json 到远程 SpringBoot 微服务
- android - 使用 MediaRecorder 录制的音频无法使用 MediaPlayer 播放
- android - 如何在android中完全禁用自动填充
- java - Java lambda 只抛出表达式样式而不是语句样式
- c# - ASP.NET MVC 5 应用程序