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
我的偏好是使用尽可能少的代码...
您可以使用
IN
来做到这一点 试试这个:在我看来,它没那么复杂......更容易阅读和维护。
乍一看...
您所需要的只是一个带有
MAX
聚合函数的GROUP BY
子句:事情从来没有那么简单,不是吗?
我刚刚注意到您还需要
content
列。这是 SQL 中一个非常常见的问题:在每个组标识符的列中查找具有某个最大值的行的全部数据。在我的职业生涯中我经常听到这样的说法。事实上,这是我在当前工作的技术面试中回答的问题之一。
实际上,Stack Overflow 社区创建了一个标签来处理这样的问题:greatest-n-per-group。
基本上,您有两种方法可以解决该问题:
使用简单的
group-identifier, max-value-in-group
子查询连接在这种方法中,您首先在子查询中找到
group-identifier, max-value-in-group
(上面已解决)。然后,将表连接到子查询,并在group-identifier
和max-value-in-group
上相等:与 self 左连接,调整连接条件和过滤器
在这种方法中,您将表与其自身左连接。平等存在于
group-identifier
中。然后,2个聪明的举动:NULL
(这是一个LEFT JOIN
,还记得吗?) 。然后,我们过滤连接结果,仅显示右侧为 NULL 的行。所以你最终会得到:
结论
两种方法都会带来完全相同的结果。
如果您有两行
group-identifier
具有max-value-in-group
,则这两行都将出现在两种方法的结果中。这两种方法都兼容 SQL ANSI,因此,无论其“风格”如何,都可以与您最喜欢的 RDBMS 配合使用。
这两种方法对性能也都很友好,但是您的情况可能会有所不同(RDBMS、数据库结构、索引等)。因此,当您选择一种方法而不是另一种方法时,基准。并确保您选择对您最有意义的一个。