如何在一个查询中合并 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;
我有一个关于 '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;