在 Postgres 中使用 max 和 group by 获取第二个属性
Getting second attribute using max and group by in Postgres
我在 Postgres 中有下一个问题。
我有评论的产品,每条评论都有投票。
所以这里有两个 table,一个 "votes" table 和一个 "reviews" table:
Table "votes"
Column | Type | KEYS
-----------+---------+----------------------------------------------------
id | integer |
user_id | integer | FK to users table
review_id | integer | FK to reviews table
Table "reviews"
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。
我知道你会认为这个问题在 Whosebug 中得到了解决,就像 here 一样。但是我无法用 post 或尝试使用 OVER PARTITION 来解决这个问题。
如果问题已在 Whosebug 中得到解决,在此先表示感谢和抱歉。
这应该 return 使用最多产品的评论 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;
这也可以使用 window 函数来完成:
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 标准功能,几乎所有数据库都应具备该功能。
我在 Postgres 中有下一个问题。
我有评论的产品,每条评论都有投票。
所以这里有两个 table,一个 "votes" table 和一个 "reviews" table:
Table "votes"
Column | Type | KEYS
-----------+---------+----------------------------------------------------
id | integer |
user_id | integer | FK to users table
review_id | integer | FK to reviews table
Table "reviews"
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。
我知道你会认为这个问题在 Whosebug 中得到了解决,就像 here 一样。但是我无法用 post 或尝试使用 OVER PARTITION 来解决这个问题。
如果问题已在 Whosebug 中得到解决,在此先表示感谢和抱歉。
这应该 return 使用最多产品的评论 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;
这也可以使用 window 函数来完成:
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 标准功能,几乎所有数据库都应具备该功能。