2017-08-09 2 views
3

Est-il possible de lister le nom de la ville qui contient seulement la côte et la région uniques? (Autrement dit, il y a plusieurs villes de la même côte et de la région, donc ils devraient être exclus)SQL GROUP BY deux groupes différents

Exemple:

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 

Dans cet exemple, je veux que la sortie soit:

Seattle 
San Jose 
Florida 
Boston 

New York et Buffalo sont omis parce qu'ils partagent la même côte et la même région, tout comme Los Angeles et San Diego.

J'ai essayé:

SELECT DISTINCT COAST, REGION 
FROM MAP 

qui m'a donné le coût et de la région, mais pas le nom de la ville.

J'ai essayé:

SELECT CITY 
FROM MAP 
GROUP BY COAST, REGION 

Mais il m'a donné une erreur (voir erreur ci-dessous).

Merci pour toute aide!

EDIT: J'ai essayé d'ajouter la clause HAVING, mais elle m'a quand même donné la même erreur qu'avant. C'est l'erreur que j'ai eue:

ERREUR 1055 (42000); L'expression # 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée run_iu98jon.MAP.CITY qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; Ceci est incompatible avec sql_mode = only_full_group_by

+0

L'erreur est probablement que vous avez mal orthographié 'COAST' dans votre dernière requête ci-dessus. Si vous épelez COAST correctement, il renvoie tous les noms de villes distincts, mais ne renvoie pas d'erreur. –

Répondre

4

Vous avez tout près, vous avez juste besoin d'une clause HAVING, qui est comme une clause WHERE pour les métriques agrégées par groupe.

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


Edit: Voici le lien SQL Fiddle: http://sqlfiddle.com/#!9/8da83b/2/0


Edit 3: Cela semble inutilement compliqué, mais il fonctionne et évite d'utiliser tous les champs qui ne sont pas regroupés.

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 

En aparté, il semble assez ridicule d'utiliser StackOverflow pour résoudre vos problèmes de HackerRank. Je l'inclut comme un exercice d'apprentissage;)

+0

J'ai essayé d'ajouter la clause HAVING, il m'a quand même donné l'erreur: ERROR 1055 (42000); L'expression # 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient une colonne non agrégée run_iu98jon.MAP.CITY qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; Ceci est incompatible avec sql_mode = only_full_group_by – dd483pe

+0

Quelle version de MySQL utilisez-vous? –

+0

Vous ne savez pas de quelle version il s'agit. Juste faire un peu d'exercice en ligne à partir de hackerrank. – dd483pe