2010-07-09 7 views
2

Je suis nouveau sur le serveur Sql, et mon fond MySql est seulement décent, rien d'exceptionnel.distincte sur une seule colonne, mais renvoyant une ligne de la même table basée sur une condition non sélectionnée

J'ai une table avec 5 colonnes:

Neighbrhood 
City 
State 
zip_code 
zip_percent 

L'objectif de la requête: Fournir une liste des quartiers (uniques) dans une ville et la zip_code qui correspond à la plus élevée zip_percent. Ainsi retour 2 colonnes:

Neighborhood 
zip_code 

Lorsque le zip_code est le « plus représentative » du quartier, en vertu d'être de la couverture la plus élevée pour cent ou « zip_percent »

Questions: Depuis un quartier peut chevaucher plusieurs zip_codes J'ai un problème à les obtenir distinctement. La clause distincte m'empêche de commander par une colonne non sélectionnée.

D'une manière ou d'une autre, je pense que j'ai besoin de prendre cette sous-requête et de la rejouer sur la table d'origine en utilisant une commande MAX sur la colonne zip_percent. Je ne peux tout simplement pas mettre tous les morceaux ensemble. J'apprécierais vraiment toute aide.

git.github.com/469915

Vous pouvez voir un exemple de la question ici avec des quartiers comme « Arbor Heights » et « Rainer Beach »

+1

Le nom du produit est "SQL Server", pas "MS SQL". –

Répondre

1
SELECT  Q1.Neighborhood, 
      Q1.Zip 
FROM  TableName AS Q1 
LEFT JOIN (SELECT Neighborhood, MAX(zip_percent) as Zip_Percent FROM TableName GROUP BY Neighborhood) AS Q2 
ON   Q1.Zip_Percent = Q2.Zip_Percent 
AND  Q1.Neighborhood = Q2.Neighborhood 

Gardez à l'esprit que cela pourrait avoir des résultats inattendus dans les quartiers où le pourcentage de fermeture maximale est partagé par de nombreux zips. par exemple.

+------------------------------------+ 
| NeighborHood | Zip | Zip Percent | 
+------------------------------------+ 
| A   | 91345 | 50   | 
+--------------+-------+-------------+ 
| A   | 91346 | 50   | 
+--------------+-------+-------------+ 
+0

+1 pour LEFT JOIN –

0

Vous devez effectuer une clause group by pour que le travail distinct puisse fonctionner. DISTINCT ne fonctionne pas sur une colonne. Il fonctionne sur une ligne.

Donc, ce que vous voulez faire est une sous-requête pour obtenir le maximum de zippercent.

SELECT MAX(ZipperCent) AS TheMax FROM YourTable 
GROUP BY ZipCode 

Cela vous donnera le maximum zippercent basé sur un code postal, rappelez-vous qu'un code peut couvrir plusieurs postal_names. Par exemple, 98107 est seattle mais 98116 en est ainsi. Donc, vous ne voulez pas grouper par le nom de la ville, groupe par le code postal.

Maintenant que vous avez au maximum zippercents par code que vous utilisez simplement que comme une sous requête de saisir les autres informations dont vous avez besoin:

SELECT YourOtherField1, YourOtherField2, t.TheMax FROM YourTable INNER JOIN (SELECT MAX(ZipperCent) AS TheMax FROM YourTable GROUP BY ZipCode) t 
ON t.YourPrimaryKey = YourTable.PrimaryKey 
0

Il serait mieux si vous aviez un champ d'ID autoincrement sur la table ainsi pour gérer facilement les cas où il y a plus d'une rangée avec le même max(zip_percent) par quartier.Moins ce point, cela devrait être à peu près correcte:

with max_zp as 
    select 
    Neighborhood, 
    max(zip_percent) zp 
    from 
    tbl 
    group by 
    Neighborhood 
select 
    t.NeighborHood, 
    t.zipcode 
from 
    tbl t 
    join max_zp mz on t.Neighborhood = mz.Neighborhood and t.zip_percent = mz.zp 
0
Select 
    Neighbrhood, 
    zipcode 

FROM 
    geoTable g 
INNER JOIN 

( 
SELECT 

    zip_code, 
    MAX(zip_percent) zip_percent 
FROM 
    geoTable 
GROUP BY 
     zipcode 
) maxG 
ON g.zip_code = maxG.zip_code 
    and g.zip_percent = maxG.zip_percent 
2

Essayez d'utiliser ROW_NUMBER:

SELECT Neighborhood, zip_code 
FROM (
    SELECT 
     Neighborhood, zip_code, 
     ROW_NUMBER() OVER (PARTITION BY Neighborhood 
          ORDER BY zippercent DESC) AS rn 
    FROM neighbourhoods_zip 
) AS T1 
WHERE rn = 1 
 
Neighborhood zip_code 
Adams   98107 
Alki   98116 
ArborHeights 98146 
Atlantic  98144 
Belltown  98121 
BitterLake 98133 
Briarcliff 98199 
etc... 
Questions connexes