在SQL
中检索每个组的顶部N记录本指南演示了如何在SQL表中的每个组中有效检索每个组的顶部N记录,按年龄(下降)订购,然后按人的名字按字母来处理以处理领带的字母。
方案:
想象一张包含有关人员的信息,他们的群体隶属关系及其年龄的表:的目标是检索每个组的前2个(n = 2)记录,优先考虑老年人并使用字母顺序解决领带。所需的输出为:
Person | Group | Age |
---|---|---|
Bob | 1 | 32 |
Jill | 1 | 34 |
Shawn | 1 | 42 |
Jake | 2 | 29 |
Paul | 2 | 36 |
Laura | 2 | 39 |
>解决方案:
> UNION ALL
窗口函数。
ROW_NUMBER()
>
此方法很简单,但对于拥有许多组和大量记录的表和大量记录的表可能会降低。 它涉及为每个组创建一个单独的查询,并使用组合结果。 此示例将检索每个组的前2个记录(n = 2):>
这种方法需要为每个其他组修改。 对于大量组而言,这是不可扩展的。UNION ALL
>
<code class="language-sql">( SELECT * FROM mytable WHERE `group` = 1 ORDER BY age DESC, person LIMIT 2 ) UNION ALL ( SELECT * FROM mytable WHERE `group` = 2 ORDER BY age DESC, person LIMIT 2 )</code>
>窗口函数提供了更有效,更可扩展的解决方案。它根据指定的排序为每个组中的每一行分配一个唯一的等级。
ROW_NUMBER()
进一步读取:
<code class="language-sql">SELECT person, `group`, age FROM ( SELECT person, `group`, age, ROW_NUMBER() OVER (PARTITION BY `group` ORDER BY age DESC, person) as rn FROM mytable ) as ranked_data WHERE rn <= 2;</code>
https://www.php.cn/link/131632CB7EEB986974E1BE59AF6AF6AF67E8FErn
以上是如何检索SQL中每个组的顶部N记录?的详细内容。更多信息请关注PHP中文网其他相关文章!