2
votes

sql sélectionnez l'enregistrement avec la valeur la plus basse des deux

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!


1 commentaires

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?


4 Réponses :


1
votes

Que diriez-vous de

select * from table where zip = ‘10001’ order by transit limit 1


0 commentaires

2
votes

Utilisez ORDER BY avec LIMITE :

SELECT t.*
FROM mytable t
WHERE t.zipcode = ?
ORDER BY t.transit
LIMIT 1


0 commentaires

0
votes

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.


0 commentaires

0
votes

En supposant que vous souhaitiez également renvoyer la valeur de 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

Remplacez toutes les références à votre table par le nom de votre table.


0 commentaires