【问题标题】:Alternative to using max() in where-section?在 where 部分使用 max() 的替代方法?
【发布时间】:2018-09-14 10:48:14
【问题描述】:

我对 SQL 很陌生,我试图只显示最昂贵的书的一个类别。我的第一个想法是从select 中删除max(books.purchase_price) 并将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 的条目;和 categories 具有 category_id 和不同的类别(名称)。

【问题讨论】:

  • 当前代码“有效”,但给了我类别和最高价格。我只想显示最贵的书的类别名称。
  • 你应该检查this
  • 如果有两本(或更多)书的最高价格相同,预期的结果是什么?

标签: sql postgresql greatest-n-per-group


【解决方案1】:

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

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;

【讨论】:

  • 谢谢,这几乎正是我想要的。我只需要将选择部分更改为“选择 c.category”
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多