与PARTITION BY postgres一起使用的地方

时间:2019-01-15 19:18:25

标签: sql postgresql

我有代码:

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

哪个给我:

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

如果您对有效的brewery_ids进行子查询,则可以加入该列表。像这样:

SELECT br.name brewery_name, ibu, AVG(ibu) OVER (PARTITION BY 
       b.brewery_id ORDER BY ibu DESC)
FROM beers b
JOIN (
   SELECT brewery_id
   FROM beers
   GROUP BY brewery_id
   HAVING COUNT(DISTINCT ibu) >= 5
) X ON X.brewer_id = b.brewery_id 
JOIN breweries br ON b.brewery_id = br.brewery_id
WHERE ibu IS NOT NULL

关于这样的查询的好处是-您可以运行子查询以验证它是否限于所需的ID。然后将其放入您的查询中。

答案 1 :(得分:1)

我会坚持使用具有使用窗口功能的查询:

\eqref{}