如何在一个查询中合并 max 和 count

How to combine max and count in one query

我有一个关于 'max' 和 'count' 函数的简单问题。

我已经阅读了一些帖子,但它们并不令我满意,或者我不能很好地理解它们以使用它们

我试着参考了this

这是我的查询:

select wojewodztwo, count(*) as liczba from wojewodztwa 

inner join powiaty on wojewodztwa.klwoj = powiaty.klwoj 
inner join gminy on powiaty.klpow = gminy.klpow 
inner join miejscowosci on gminy.klgm = miejscowosci.klgm 

where miejscowosc = 'Nowy Dwór' 
group by wojewodztwo order by count(*) desc

这个查询的结果是这样的

现在我只想获取最大值行作为答案。我不想使用 Limit 2 我想做类似 max(count) 的事情,但似乎聚合函数不能堆叠在彼此之一上

听起来您想将 FETCH FIRST 1 ROW WITH TIES 放在查询的末尾。此 WITH TIES 功能是在 v13.

中引入的

在此之前,我认为您需要使用 window 函数围绕现有查询包装另一个查询(或在客户端执行)。要使用 window 函数,您实际上必须将其包裹在两层 select 中,因为您不能在 where 子句中使用 window 函数,因此您需要定义它在一层上并在外层使用它。

所以它看起来像这样:

select wojewodztwo, liczba from ( 
  select wojewodztwo, liczba, max(liczba) over () as _max from (   
    select wojewodztwo, count(*) as liczba from wojewodztwa 
    inner join powiaty on wojewodztwa.klwoj = powiaty.klwoj 
    inner join gminy on powiaty.klpow = gminy.klpow 
    inner join miejscowosci on gminy.klgm = miejscowosci.klgm 
    where miejscowosc = 'Nowy Dwór' 
    group by wojewodztwo
  ) f
) ff where _max=liczba

使用窗口函数和 CTE 会更快更优雅:

WITH
T AS
(
SELECT wojewodztwo, COUNT(*) as liczba, MAX(COUNT(*)) OVER() AS MAX_liczba  
FROM   wojewodztwa 
       INNER JOIN powiaty 
          ON wojewodztwa.klwoj = powiaty.klwoj 
       INNER JOIN gminy 
          ON powiaty.klpow = gminy.klpow 
       INNER JOIN miejscowosci 
          ON gminy.klgm = miejscowosci.klgm 
WHERE  miejscowosc = 'Nowy Dwór' 
GROUP  BY wojewodztwo
)
SELECT wojewodztwo, liczba
FROM   T
WHERE  liczba = MAX_liczba;