在where-section中使用max()的替代方法?

问题描述 投票:1回答:1

我对SQL很陌生,我试图只显示一本有最贵书的类别。我的第一个想法是从max(books.purchase_price)中删除select并将max(books.purchase_price) = books.purchase_price添加到where部分。但这给了我一个错误信息。

select categories.category, max(books.purchase_price) as price
from books, categories
where categories.category_id = books.category_id
group by categories.category
order by pris desc
limit 1

只有两个表:books,其中包含标题,价格和category_id的条目;和categoriescategory_id和不同的类别(名称)。

sql postgresql greatest-n-per-group
1个回答
3
投票

如果您只想要一条最大记录,请使用以下查询:

SELECT c.category
FROM books b
INNER JOIN categories c
    ON c.category_id = b.category_id
ORDER BY b.purchase_price DESC
LIMIT 1;

这按照购买价格按降序排序(即最昂贵的第一个),然后限制为单个记录。请注意,我使用了显式的内连接,而不是上面使用的隐式旧学校连接。

如果可能有几本书以最高价格捆绑,那么我们将不得不求助于使用RANK函数:

SELECT DISTINCT category
FROM
(
    SELECT c.category,
        RANK() OVER (ORDER BY b.purchase_price DESC) rank
    FROM books b
    INNER JOIN categories c
        ON c.category_id = b.category_id
) t
WHERE t.rank = 1;
© www.soinside.com 2019 - 2024. All rights reserved.