Sql 有没有办法在一个SELECT语句中实现这一点?使用分组方式

Sql 有没有办法在一个SELECT语句中实现这一点?使用分组方式,sql,sql-server,Sql,Sql Server,我有一张桌子,桌子一。此表中有名称、城市、价格。名称都是唯一的,城市可以重复使用。我想查询每个城市的最高价格,以及与该行关联的名称。要获得每个城市的最高价格,我只需: SELECT MAX(price), city FROM table1 GROUP BY city 但我也想知道名字。如果我尝试 SELECT MAX(price), city, name FROM table1 GROUP BY city 然后,我只得到一个查询错误,关于名称如何不包含在GROUPBY中。如果我通过向组中添加

我有一张桌子,桌子一。此表中有名称、城市、价格。名称都是唯一的,城市可以重复使用。我想查询每个城市的最高价格,以及与该行关联的名称。要获得每个城市的最高价格,我只需:

SELECT MAX(price), city FROM table1 GROUP BY city
但我也想知道名字。如果我尝试

SELECT MAX(price), city, name FROM table1 GROUP BY city
然后,我只得到一个查询错误,关于名称如何不包含在GROUPBY中。如果我通过向组中添加名称,则它不符合我的要求。我可以用两个查询来思考如何做到这一点,但我打赌有一种方法可以在一个查询中做到。我错过了什么

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

SELECT
  name, city, price
FROM
  table1 t
WHERE
  price = (SELECT MAX(price) FROM table 1 WHERE city = t.city)
如果有多行,则城市索引、价格索引和价格索引有助于此查询的性能

SELECT name, city, price
FROM table1 t
WHERE price = (SELECT MAX(price) FROM table1 WHERE city = t.city)
请注意,您没有指定如果一个城市中的两种产品都是最贵且价格相同的,应该怎么办。这里的查询返回这两个选项中的任何一个,但只返回一个,您也可以以不同的方式进行处理。

为了完整起见,这里有一个使用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

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

是的,这似乎是因为我不知道自己到底想要什么,或者更具体地说,使用旧数据库表来尝试一些新的查询。其他答案让我重复。我只是有点了解你的查询功能,但过一天我就会知道了。ThanksI将查询分为两步:首先,我在虚拟表中对按城市划分的价格进行排序,该构造的名称是a,这样我就可以通过其第九级知道哪个项目最昂贵。然后,我根据它进行过滤。所以,如果你想知道每个城市前三个最昂贵的名字,你可以在聊天时问我几个问题,这确实管用。如果价格相同,它会给出同一城市的多行。我猜组员只给你第一个?我不太清楚你的查询是怎么做的,但是它做了什么。每个城市的价格都在重新计算吗?显然,从表1中选择MAXprice,其中city=t。city不仅仅返回一个数字,但我不确定how@cost,GROUP BY的问题是它聚合,因此它从多个行值中计算一些内容,但您不知道原始行是什么。这就是为什么这里没有一个解决方案使用GROUP BY的原因,即使使用GROUP BY嵌套查询上的联接可以实现与此示例概念相同的方法。@cost,是的,每个城市的价格都在重新计算。查询将查找价格为该特定城市的最高价格的名称和城市。多行是否返回相同的名称?还是仅仅是同一个城市?@LoganSerman多行具有相同的城市,这只是因为数据不正确。我觉得我在理解它是如何工作的过程中遗漏了一些东西,尽管我对SQL还是很陌生。如果我只是从表1中运行selectmaxprice,其中city=t.city,那么它只返回一个数字,即任何城市的最高价格。在整个查询中发生了什么不同的事情使得它能够正常工作?想象一下查询在数据库中的每一行中迭代。在特定行上,查询希望确定是否应将该行作为其结果集的一部分,如果应包括该行,则将返回名称、城市和价格。但是什么时候应该包括它呢?根据WHERE条款,当该行的价格等于同一城市所有行的最高价格时,应包括该行。WHERE子句中的子查询将为数据库中的每个城市返回不同的值,该值将是该特定城市的最高价格。
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