首页 > 解决方案 > WHERE 与 PARTITION BY postgres 一起使用

问题描述

我有代码:

SELECT br.name brewery_name, ibu, AVG(ibu) OVER (PARTITION BY 
       b.brewery_id ORDER BY ibu DESC)
FROM beers b
JOIN breweries br
ON b.brewery_id = br.brewery_id
WHERE ibu IS NOT NULL

这给了我:

在此处输入图像描述

我想要得到的是消除 ibu 值小于 5 的啤酒厂(其中很多有 1 或 2 - 在此快照中不可见)。但我仍然想保留分区而不分组 - 所以图片上可见的行将保持不变。

我尝试了 WHERE、HAVING、子查询。但是我收到错误说我必须对其他值进行分组 - 例如,“WHERE 中不允许使用聚合函数”。

标签: sqlpostgresql

解决方案


我会坚持使用窗口函数的查询:

SELECT brewery_name, ibu, avg_ibu
FROM (SELECT br.name as brewery_name, ibu,
             AVG(ibu) OVER (PARTITION BY b.brewery_id ORDER BY ibu DESC) as avg_ibu,
             COUNT(ibu) OVER (PARTITION BY b.brewery_id) as cnt_ibu
      FROM beers b JOIN
           breweries br
          ON b.brewery_id = br.brewery_id
      WHERE ibu IS NOT NULL
     ) bb
WHERE cnt_ibu >= 5;

推荐阅读