我有一张桌子,桌子1.在这张桌子上是名字,城市,价格。名称都是独一无二的,城市可以重复使用。我想创建一个查询,它给出了每个城市的最高价格,以及与该行相关联的名称。为了获得每个城市的最高价格,我只是这样做:
SELECT MAX(price), city FROM table1 GROUP BY city
但我也想要这个名字。如果我试试
SELECT MAX(price), city, name FROM table1 GROUP BY city
然后我只是得到一个查询错误,关于名称如何不包括在组中。如果我将名称添加到组中,则它不会按我的意愿执行操作。我可以想到如何使用两个查询来做到这一点,但我敢打赌,只有一个方法可以做到这一点。我错过了什么?
我在stackoverflow上发现了一些类似的问题,但它们似乎都在做一些比我想要的更复杂的事情。我只使用过简单的SQL查询,所以我正在教自己一些更高级的功能。
答案 0 :(得分: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;
请注意,如果城市中的两种产品价格最高且价格相同,则您没有说明会发生什么。这里的查询返回两个中的任何一个(但只有一个),你也可以用不同的方式处理它。
答案 1 :(得分:1)
SELECT
name, city, price
FROM
table1 t
WHERE
price = (SELECT MAX(price) FROM table 1 WHERE city = t.city)
如果有多行,则(city, price)
上的索引和(price)
上的索引有助于提高此查询的效果。
答案 2 :(得分:1)
SELECT name, city, price
FROM table1 t
WHERE price = (SELECT MAX(price) FROM table1 WHERE city = t.city)
答案 3 :(得分: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
我更喜欢排名方法,因为它更清晰,更灵活。