Dans Sqlite 3, j'essaie de comprendre comment sélectionner des lignes en fonction d'une valeur minimale. Je pense que je suis limité en ne connaissant pas suffisamment la terminologie associée pour rechercher efficacement sur Google.
Le tableau ressemble à:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Je veux obtenir les lignes où num2
est 1, 2
, et 4
. Je veux faire la sélection en fonction de la valeur minimale de num pour chaque valeur unique de la colonne de texte.
Donc, pour text = 'a'
, la valeur minimale de num
est 0
, donc je veux les lignes 1 et 2. Pour text = 'b'
, la valeur minimale de num
est 1
, donc je veux la ligne 4
.
En utilisant diverses combinaisons de group by, je peux obtenir des lignes 1
et 2
ou des lignes 1
et 4
. J'ai l'impression qu'il me manque un composant SQL qui ferait ce que je veux, mais je n'ai pas réussi à comprendre ce que cela pourrait être.
Quelle est la bonne façon de faire ce type de requête?
Solution possible
J'ai trouvé un moyen de le faire. Je ne suis pas assez réputé pour répondre à ma propre question, alors je fais la mise à jour ici. Je ne sais pas si c'est toujours correct ou à quoi ressemble l'efficacité. Tout commentaire est le bienvenu.
J'ai utilisé une instruction de sélection composée, où une requête trouve la valeur minimale de num pour chaque valeur unique de texte:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Ensuite, je l'ai joint à la table complète pour obtenir toutes les lignes correspondant à ces deux colonnes.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
requête est stocké dans une table temporaire, qu'il soit écrit en tant que CTE, vue ou en ligne en tant que sous-requête.J'ai tendance à faire ce genre de chose avec une auto-jointure externe:
C'est essentiellement dire; donnez-moi tous les enregistrements qui n'ont pas une valeur supérieure, c'est-à-dire null.
la source
Alors, comment pouvez-vous trouver vous-même la réponse à votre question la prochaine fois? À mon avis, c'est en décomposant et en suivant la logique. Et vous avez raison:
Cela se traduit par:
(Cela devrait être équivalent à votre
having
requête. Il pourrait être intéressant de regarder les lignes oùnum
est égal à NULL. Le plus précis: regardez quel effet les lignes avec des valeurs nulles ont, que vous voudrez peut-être filtrer en premier avec awhere num is not null
)De là, vous pouvez obtenir le résultat souhaité en:
Ou en utilisant une jointure:
Et lorsque les performances ne sont pas suffisantes pour vos tables, commencez à examiner des instructions plus complexes.
la source
Cette requête ne devrait-elle pas être exactement ce dont vous avez besoin?
la source
num2
valeurs sont uniques.