Heim  >  Fragen und Antworten  >  Hauptteil

SQL wählt nur Zeilen mit maximalem Wert in der Spalte aus

<p>Ich habe dieses Dokumentformular (hier ist eine vereinfachte Version): </p> <table class="s-table"> <thead> <tr> <th>id</th> <th>Übertragung</th> <th>Inhalt</th> </tr> </thead> <tbody> <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> </tbody> </table> <p>Wie wähle ich eine Zeile pro ID und nur die größte Drehzahl aus? </p><p> Unter Verwendung der oben genannten Daten sollte das Ergebnis zwei Zeilen enthalten: <code>[1, 3, ...]</code> und <code>[2, ​​​​1, ..]</code> . Ich verwende<em><strong>MySQL</strong></em>. </p> <p>Derzeit verwende ich eine Prüfung in einer <code>while</code>-Schleife, um alte Versionen im Ergebnissatz zu erkennen und zu überschreiben. Aber ist dies der einzige Weg, dieses Ergebnis zu erreichen? Sie haben keine <strong>SQL</strong> </p>
P粉937382230P粉937382230423 Tage vor413

Antworte allen(2)Ich werde antworten

  • P粉638343995

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

    我的偏好是使用尽可能少的代码...

    您可以使用IN来做到这一点 试试这个:

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

    在我看来,它没那么复杂......更容易阅读和维护。

    Antwort
    0
  • P粉517475670

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

    乍一看...

    您所需要的只是一个带有 MAX 聚合函数的 GROUP BY 子句:

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

    事情从来没有那么简单,不是吗?

    我刚刚注意到您还需要 content 列。

    这是 SQL 中一个非常常见的问题:在每个组标识符的列中查找具有某个最大值的行的全部数据。在我的职业生涯中我经常听到这样的说法。事实上,这是我在当前工作的技术面试中回答的问题之一。

    实际上,Stack Overflow 社区创建了一个标签来处理这样的问题:

    基本上,您有两种方法可以解决该问题:

    使用简单的group-identifier, max-value-in-group子查询连接

    在这种方法中,您首先在子查询中找到group-identifier, max-value-in-group(上面已解决)。然后,将表连接到子查询,并在 group-identifiermax-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

    与 self 左连接,调整连接条件和过滤器

    在这种方法中,您将表与其自身左连接。平等存在于group-identifier中。然后,2个聪明的举动:

    1. 第二个连接条件是左侧值小于右侧值
    2. 当您执行第 1 步时,实际具有最大值的行将在右侧显示 NULL(这是一个 LEFT JOIN,还记得吗?) 。然后,我们过滤连接结果,仅显示右侧为 NULL 的行。

    所以你最终会得到:

    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;

    结论

    两种方法都会带来完全相同的结果。

    如果您有两行 group-identifier 具有 max-value-in-group,则这两行都将出现在两种方法的结果中。

    这两种方法都兼容 SQL ANSI,因此,无论其“风格”如何,都可以与您最喜欢的 RDBMS 配合使用。

    这两种方法对性能也都很友好,但是您的情况可能会有所不同(RDBMS、数据库结构、索引等)。因此,当您选择一种方法而不是另一种方法时,基准。并确保您选择对您最有意义的一个。

    Antwort
    0
  • StornierenAntwort