在Postgres中使用max和group by获取第二个属性

时间:2015-11-13 15:20:14

标签: sql postgresql max aggregation

我在Postgres有下一个问题。

我的产品有评论,每篇评论都有投票。

所以这里有两张桌子,一张"投票"表和"评论"表:

表"投票"

 Column   |  Type   |                     KEYS                      
-----------+---------+----------------------------------------------------
 id        | integer |
 user_id   | integer | FK to users table
 review_id | integer | FK to reviews table

表"评论"

   Column   |            Type             |                      KEYS                       
------------+-----------------------------+--------------------------------------
 id         | integer                     |  
 product_id | integer                     |  FK to products
 user_id    | integer                     |  FK to users

我想获得每个产品的最多投票评论。换句话说,我需要获得每个产品具有最大投票数的review_id。

以下是我正在使用的查询:

SELECT max(votes_per_review.votes), reviews.product_id
     FROM (SELECT count(*) AS votes,review_id FROM votes GROUP BY review_id) AS votes_per_review, reviews
     WHERE votes_per_review.review_id = reviews.id
     GROUP BY reviews.product_id

我获得了每种产品和产品ID最受欢迎评价的投票数,但我没有收到review_id。

我知道您可以认为这个问题在StackOverflow中已经解决,如here。但是,我无法使用该帖子解决此问题或尝试使用OVER PARTITION。

如果在StackOverflow中解决了问题,请提前表示歉意。

1 个答案:

答案 0 :(得分:1)

这应该使用distinct on

返回大多数产品的评论
select distinct on (r.product) rv.*
from (select r.product, r.review_id, count(*) as numvotes
      from reviews r join
           votes v
           on r.id = v.review_id
      group by r.product, r.review_id
     ) rv
order by r.product, numvotes desc;

这也可以使用窗口函数来完成:

select rv.*
from (select r.product, r.review_id, count(*) as numvotes,
             row_number() over (partition by r.product order by count(*) desc) as seqnum
      from reviews r join
           votes v
           on r.id = v.review_id
      group by r.product, r.review_id
     ) rv
where seqnum = 1;

这使用ANSI标准功能,几乎可以在任何数据库中使用。