问题描述
我有一张这样的桌子
水果-状态
-------------------
苹果-新
苹果-好的
苹果-好的
苹果-不好
香蕉-新
香蕉-好的
香蕉-不好
橙色-新
橙色-好的
橙色-好的
橙色-好的
橙色-好的
橙色-好的
我想获取未处于“不良”状态的物品以及该物品处于“良好”状态的次数。类似这样的事情:
水果-好吧
----------------------
橙色-5
此时,苹果和香蕉处于“不良”状态。 和橘子还可以五次(不包括新状态)。
我尝试过这种方法,但它不能正常工作,因为它也使苹果和香蕉的状态良好。
select * from (select fruit,count(fruit) AS okaycount
from fruits
where state='okay'
group by fruit) as din
order by din.okaycount desc
limit 10;
也尝试过这个。没有用。
SELECT distinct ndt.fruit,COUNT( ndt.fruit ) as okaycount
FROM(select * from fruits where fruit in (select distinct correlationid
from fruits
where wcsstatus!='bad')) as ndt
GROUP BY ndt.fruit
HAVING count(*) > 3;
解决方法
在Postgres中,我会在having
子句中用过滤计数和布尔聚合来表达这一点:
select fruit,count(*) filter(where status = 'okay') cnt
from fruits
group by fruit
having not bool_or(status = 'bad')
,
根据所需结果,可以使用:
select fruit,sum( (status = 'okay')::int )
from fruit
group by fruit
having sum( (status = 'bad')::int ) = 0;