Requête de valeur maximale pour des identifiants identiques
Dans une table avec plusieurs enregistrements partageant le même identifiant, vous pouvez rencontrer un scénario dans lequel vous devez récupérer la valeur maximale pour chaque ID. Voici une requête pour y parvenir :
Approche de sous-requête :
select cur.id, cur.signal, cur.station, cur.ownerid from yourtable cur where not exists ( select * from yourtable high where high.id = cur.id and high.signal > cur.signal )
Cette requête utilise une sous-requête avec une clause "NOT EXISTS" pour exclure toutes les lignes avec une valeur supérieure signal que la ligne actuelle. Ce faisant, il sélectionne la ligne avec le signal maximum pour chaque ID. L'inconvénient potentiel est qu'il peut répertorier plusieurs lignes pour les identifiants avec des valeurs maximales égales.
Approche de jointure externe :
Une approche alternative consiste à utiliser une jointure externe avec un self-join :
select a.id, a.signal, a.station, a.ownerid from yourtable a left join yourtable b on a.id = b.id and a.signal < b.signal where b.id is null
Cette requête utilise une jointure externe pour trouver les lignes sans signaux supérieurs. En appliquant une condition qui vérifie les valeurs nulles dans les lignes jointes, il filtre les lignes avec des signaux inférieurs. Cette approche garantit une seule ligne pour chaque ID avec le signal maximum.
Exemple :
En utilisant le tableau fourni, les requêtes renverraient les résultats suivants :
Approche de sous-requête :
ID | Signal | Station | OwnerID |
---|---|---|---|
111 | -120 | Home | 1 |
222 | -95 | Work | 1 |
Jointure externe Approche :
ID | Signal | Station | OwnerID |
---|---|---|---|
111 | -120 | Home | 1 |
222 | -95 | Work | 1 |
Conclusion :
Les deux approches atteignent le même objectif : récupérer la valeur maximale du signal pour chaque ID. L'approche par sous-requête peut être plus efficace pour les petits ensembles de données, tandis que l'approche par jointure externe peut être plus efficace pour les ensembles de données plus volumineux, surtout s'il existe plusieurs lignes avec des signaux identiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!