SQL wählt nur Zeilen mit maximalem Wert in der Spalte aus
P粉937382230
P粉937382230 2023-08-23 11:08:57
0
2
383

Ich habe dieses Dokumentformular (hier ist eine vereinfachte Version):

id Übertragung Inhalt
1 1 ...
2 1 ...
1 2 ...
1 3 ...

Wie wähle ich eine Zeile pro ID und nur die größte Drehzahl aus?

Unter Verwendung der oben genannten Daten sollte das Ergebnis zwei Zeilen enthalten: [1, 3, ...] und [2, 1, ..] . Ich verwendeMySQL.

Derzeit verwende ich eine Prüfung in einer while-Schleife, um alte Versionen im Ergebnissatz zu erkennen und zu überschreiben. Aber ist dies der einzige Weg, dieses Ergebnis zu erreichen? Sie haben keine SQL

P粉937382230
P粉937382230

Antworte allen (2)
P粉638343995

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

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

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

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

    P粉517475670

    乍一看...

    您所需要的只是一个带有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、数据库结构、索引等)。因此,当您选择一种方法而不是另一种方法时,基准。并确保您选择对您最有意义的一个。

      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!