有没有办法在一个SELECT语句中执行此操作?使用分组依据

时间:2012-04-09 10:31:52

标签: sql sql-server

我有一张桌子,桌子1.在这张桌子上是名字,城市,价格。名称都是独一无二的,城市可以重复使用。我想创建一个查询,它给出了每个城市的最高价格,以及与该行相关联的名称。为了获得每个城市的最高价格,我只是这样做:

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

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

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

然后我只是得到一个查询错误,关于名称如何不包括在组中。如果我将名称添加到组中,则它不会按我的意愿执行操作。我可以想到如何使用两个查询来做到这一点,但我敢打赌,只有一个方法可以做到这一点。我错过了什么?

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

4 个答案:

答案 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

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