SQL GROUP BY两个不同的组

时间:2017-08-09 22:42:17

标签: mysql sql distinct

是否可以列出仅包含唯一海岸和地区的城市名称? (即同一海岸和地区有多个城市,因此应将其排除在外)

示例:

TABLE_NAME = MAP
City        Coast       Region
New York    East        1
Buffalo     East        1
LA          West        2
Seattle     West        1
San Jose    West        3
Florida     East        4
Boston      East        2
San Diego   West        2

在这个例子中,我希望输出为:

Seattle
San Jose
Florida
Boston

纽约和布法罗被省略,因为它们共享相同的海岸和地区,就像洛杉矶和圣地亚哥一样。

我试过了:

SELECT DISTINCT COAST, REGION 
FROM MAP

给了我费用和地区,但不是城市名称。

我试过了:

SELECT CITY 
FROM MAP 
GROUP BY COAST, REGION

但它给了我一个错误(见下面的错误)。

感谢您的帮助!

编辑: 我尝试添加HAVING子句,但它仍然给我与以前相同的错误。这是我的错误:

ERROR 1055(42000); SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列run_iu98jon.MAP.CITY,它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by

不兼容

1 个答案:

答案 0 :(得分:4)

你非常接近,你只需要一个HAVING子句,就像分组聚合度量的WHERE子句一样。

SELECT CITY
FROM MAP
GROUP BY COAST, REGION
HAVING COUNT(*) = 1;

<小时/> 编辑:这是SQL小提琴链接:http://sqlfiddle.com/#!9/8da83b/2/0

<小时/> 编辑3:这似乎是不必要的复杂,但它可以工作,并避免使用任何未分组的字段。

SELECT City
FROM Map
INNER JOIN (
  SELECT Coast, Region, COUNT(*) as RowCount
  FROM Map
  GROUP BY Coast, Region
) AS CoastRegion ON
  Map.Coast = CoastRegion.Coast AND
  Map.Region = CoastRegion.Region 
WHERE
  CoastRegion.RowCount = 1

顺便说一句,使用StackOverflow解决HackerRank问题似乎很愚蠢。我将此作为一项学习练习;)