Maison  >  Questions et réponses  >  le corps du texte

SQL sélectionne uniquement les lignes avec la valeur maximale sur la colonne

<p>J'ai ce formulaire de document (voici une version simplifiée) : </p> <table class="s-table"> <tête> <tr> <th>id</th> <th>Transfert</th> <th>Contenu</th> ≪/tr> ≪/tête> <corps> <tr> <td>1</td> <td>1</td> <td>...</td> ≪/tr> <tr> <td>2</td> <td>1</td> <td>...</td> ≪/tr> <tr> <td>1</td> <td>2</td> <td>...</td> ≪/tr> <tr> <td>1</td> <td>3</td> <td>...</td> ≪/tr> </tcorps> </tableau> <p>Comment sélectionner une ligne par ID et uniquement le RPM le plus élevé ? </p><p> En utilisant les données ci-dessus, le résultat doit contenir deux lignes : <code>[1, 3, ...]</code> et <code>[2, ​​​​​​1, ..]</code> . J'utilise <em><strong>MySQL</strong></em>. </p> <p>Actuellement, j'utilise une vérification dans une boucle <code>while</code> pour détecter et écraser les anciennes versions dans le jeu de résultats. Mais est-ce le seul moyen d’arriver à ce résultat ? Vous n'avez pas de solution <strong>SQL</strong> </p>
P粉937382230P粉937382230423 Il y a quelques jours417

répondre à tous(2)je répondrai

  • P粉638343995

    P粉6383439952023-08-24 09:47:12

    Ma préférence est d'utiliser le moins de code possible...

    Vous pouvez le faire en utilisant IN Essayez ceci :

    SELECT * 
    FROM t1 WHERE (id,rev) IN 
    ( SELECT id, MAX(rev)
      FROM t1
      GROUP BY id
    )

    À mon avis, c'est moins complexe... plus facile à lire et à maintenir.

    répondre
    0
  • P粉517475670

    P粉5174756702023-08-24 09:16:15

    À première vue...

    Tout ce dont vous avez besoin est une clause avec MAX 聚合函数的 GROUP BY :

    SELECT id, MAX(rev)
    FROM YourTable
    GROUP BY id

    Les choses ne sont jamais aussi simples, n'est-ce pas ?

    Je viens de remarquer qu'il faut aussi content colonnes.

    Il s'agit d'un problème très courant en SQL : rechercher toutes les données d'une ligne avec une valeur maximale dans chaque colonne d'identifiant de groupe. J’entends souvent cette affirmation au cours de ma carrière. En fait, c'est l'une des questions auxquelles j'ai répondu lors d'un entretien technique dans le cadre de mon emploi actuel.

    En fait, la communauté Stack Overflow a créé une balise pour gérer des questions comme celle-ci : .

    En gros, vous avez deux manières de résoudre ce problème :

    Utilisez une simple group-identifier, max-value-in-groupjointure de sous-requête

    Dans cette approche, vous trouvez d'abord group-identifier, max-value-in-group(上面已解决)。然后,将表连接到子查询,并在 group-identifiermax-value-in-group dans la sous-requête (résolue ci-dessus). Ensuite, joignez la table à la sous-requête et rendez-la égale sur

    et max-value-in-group :

    SELECT a.id, a.rev, a.contents
    FROM YourTable a
    INNER JOIN (
        SELECT id, MAX(rev) rev
        FROM YourTable
        GROUP BY id
    ) b ON a.id = b.id AND a.rev = b.rev

    Rejoignez-vous à gauche, ajustez les conditions de participation et les filtres

    group-identifierDans cette méthode, vous rejoignez la table avec elle-même. L'égalité existe en

    . Ensuite, 2 gestes intelligents :
    1. La deuxième condition de connexion est que la valeur de gauche est inférieure à la valeur de droite
    2. NULL(这是一个 LEFT JOINLorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur apparaîtra à droite
    3. , vous vous souvenez ? ). Nous filtrons ensuite les résultats de la jointure pour afficher uniquement les lignes avec NULL sur le côté droit.

    Vous vous retrouvez donc avec :

    SELECT a.*
    FROM YourTable a
    LEFT OUTER JOIN YourTable b
        ON a.id = b.id AND a.rev < b.rev
    WHERE b.id IS NULL;

    Conclusion

    Les deux méthodes apporteront exactement les mêmes résultats.

    group-identifier 具有 max-value-in-groupSi vous avez deux lignes

    avec max-value-in-group, les deux lignes apparaîtront dans les résultats des deux méthodes.

    Les deux méthodes sont compatibles SQL ANSI, elles fonctionneront donc avec votre SGBDR préféré quelle que soit sa « saveur ».

    Les deux approches sont également favorables aux performances, mais votre situation peut différer (SGBDR, structure de base de données, index, etc.). Ainsi, lorsque vous choisissez une méthode plutôt qu'une autre, Benchmark

    . Et assurez-vous de choisir celui qui vous convient le mieux. 🎜

    répondre
    0
  • Annulerrépondre