Malgré mes recherches sur Internet, je n'ai pas trouvé de solution à ce que je pense être un simple problème SQL.
J'ai un tableau simple en tant que tel:
zip | location | transit ------------------------ 10001 | 1 | 5 10001 | 2 | 2
Cette table a bien sûr un grand nombre de codes postaux, mais j'aimerais faire une simple requête par code postal et au lieu de renvoyer toutes les lignes avec le zip, ne renvoyer qu'une seule ligne (avec les 3 colonnes), qui contient la valeur de transit la plus basse.
J'ai joué avec la fonction d'agrégation min (), mais je ne l'ai pas bien compris.
Utilisation de Postgres SQL DB 9.6
Merci!
4 Réponses :
Que diriez-vous de
select * from table where zip = â10001â order by transit limit 1
Utilisez ORDER BY avec LIMITE :
SELECT t.* FROM mytable t WHERE t.zipcode = ? ORDER BY t.transit LIMIT 1
J'utiliserais distinct sur :
select distinct on (zip) t.* from t order by zip, transit;
C'est généralement la méthode la plus efficace dans Postgres, en particulier avec un index sur (zip, transit) .
Bien sûr, si vous n'avez qu'un seul code postal qui vous intéresse, alors where / order by / limit est également tout à fait raisonnable.
En supposant que vous souhaitiez également renvoyer la valeur de Remplacez toutes les références à location associée à la valeur minimale de transit , alors voici une solution possible utilisant une jointure interne code >: select t.*
from
yourtable t inner join
(select u.zip, min(u.transit) as mt from yourtable u group by u.zip) v
on t.zip = v.zip and t.transit = v.mt
votre table par le nom de votre table.
Peut-il y avoir plus d'une ligne pour un zip avec le même transit? Si oui, souhaitez-vous afficher toutes les lignes, devrait-il y en avoir plus d'une avec le transit le plus bas? Ou juste un? Si juste un, des critères pour choisir celui-là ou un critère aléatoire est-il très bien?