组合几个相似的查询

Combining several similar queries

如何将这三个查询合并为一个?

SELECT COUNT(*) 
FROM Users 
WHERE (SELECT COUNT(*) FROM Posts WHERE Posts.OwnerUserId = Users.Id) < 10;

SELECT COUNT(*) 
FROM Users 
WHERE (SELECT COUNT(*) FROM Posts WHERE Posts.OwnerUserId = Users.Id) BETWEEN 10 AND 20;

SELECT COUNT(*) 
FROM Users 
WHERE (SELECT COUNT(*) FROM Posts WHERE Posts.OwnerUserId = Users.Id) > 20;

如果我没听错的话,你可以使用两级聚合。以下查询将每个桶放在单独的行中:

select
    case 
        when cnt < 10 then '< 10'
        when cnt < 20 then '10-20'
        else '> 20'
    end as bucket,
    count(*) cnt
from (
    select count(p.owneruserid) cnt
    from users u
    left join posts p on p.owneruserid = u.id
    group by u.id
) t
group by case 
    when cnt < 10 then '< 10'
    when cnt < 20 then '10-20'
    else '> 20'
end 

或者您可以在同一行中获取所有三个计数,如下所示:

select
    sum(case when cnt < 10 then 1 else 0 end) as cnt_less_than_10,
    sum(case when cnt >= 10 and cnt < 20 then 1 else 0 end) as cnt_10_to_20,
    sum(case when cnt > 20 then 1 else 0 end) as cnt_more_than_20
from (
    select count(*) cnt
    from users u
    inner join posts p on p.owneruserid = u.id
    group by u.id
) t