2

我有一张表,表 1。在这张表中是名称、城市、价格。名称都是唯一的,城市可以重复使用。我想做一个查询,给出每个城市的最高价格,以及与该行关联的名称。为了获得每个城市的最高价格,我只是这样做:

SELECT MAX(price), city FROM table1 GROUP BY city

但我也想要这个名字。如果我尝试

SELECT MAX(price), city, name FROM table1 GROUP BY city

然后我得到一个关于 name 如何不包含在 group by 中的查询错误。如果我将 name 添加到 group by,那么它不会做我想要的。我可以想到如何使用两个查询来做到这一点,但我敢打赌有一种方法可以做到这一点。我错过了什么?

我在 stackoverflow 上发现了一些类似的问题,但它们似乎都在做一些比我试图做的更复杂的事情。我只使用过简单的 SQL 查询,所以我正在自学一些更高级的功能。

4

4 回答 4

4
WITH RankedPrices AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY price DESC) AS ix
    FROM table1
)
SELECT * FROM RankedPrices WHERE ix=1;

请注意,如果一个城市中的两种产品价格最高且价格相同,您没有指定会发生什么。此处的此查询返回两者中的任何一个(但仅返回一个),您也可以以不同的方式处理它。

于 2012-04-09T10:41:23.287 回答
1
SELECT
  name, city, price
FROM
  table1 t
WHERE
  price = (SELECT MAX(price) FROM table 1 WHERE city = t.city)

如果有很多行,则(city, price)一次又一次的索引有助于此查询的性能。(price)

于 2012-04-09T10:35:28.497 回答
1
SELECT name, city, price
FROM table1 t
WHERE price = (SELECT MAX(price) FROM table1 WHERE city = t.city)
于 2012-04-09T10:36:25.207 回答
1

只是为了完整起见,这里有一个使用 的示例GROUP BY,但在处理每个城市的重复最高价格方面,与 Tomalak 和 Logan 的其他解决方案有相同的警告:

SELECT t2.city, t2.name, t2.price
    FROM (SELECT city, MAX(price) AS price FROM table1 GROUP BY city) AS t
    JOIN table1 AS t2 ON t.city = t2.city AND t.price = t2.price

我更喜欢排名方法,因为它更清晰、更灵活。

于 2012-04-09T11:08:58.973 回答