从 MySQL 表中检索前 N 个最大值
数据分析中的常见任务涉及选择特定列的前 N 个最大值从一张桌子上。考虑下表:
column1 | column2 |
---|---|
1 | foo |
2 | foo |
3 | foo |
4 | foo |
5 | bar |
6 | bar |
7 | bar |
8 | bar |
问题陈述:
对于给定的 n 值,检索第 1 列的前 n 个最大值,按第 2 列分组。在上面的示例中,对于 n=2,所需的输出将为:
column1 |
---|
3 |
4 |
7 |
8 |
解决方案:
虽然一个简单的方法可能涉及按列对行进行分组2并为每个组选择最大值,这只会返回每个组的绝对最大值。要检索前 n 个值,需要更高级的方法。
基于 UNION 的方法:
一种方法涉及使用 UNION 子句来组合多个查询,每个查询选择不同组的最大值。对于 n=2,以下查询就足够了:
SELECT max(column1) m FROM table t GROUP BY column2 UNION SELECT max(column1) m FROM table t WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2)
基于排名的方法:
对于更灵活的 n 值,可以使用基于排名的方法受雇。这涉及到根据column1 的值为每行分配一个排名,然后选择排名前n 的行。以下查询实现了这种方法:
SELECT t.* FROM (SELECT grouper, (SELECT val FROM table li WHERE li.grouper = dlo.grouper ORDER BY li.grouper, li.val DESC LIMIT 2,1) AS mid FROM (SELECT DISTINCT grouper FROM table ) dlo ) lo, table t WHERE t.grouper = lo.grouper AND t.val > lo.mid
将 'grouper' 替换为分组依据列的名称,将 'val' 替换为保存值的列。
LIMIT 子句定义每个组的第 n 个排名值。然后选择值大于第 n 个排名值的行。
结论:
两种方法都提供了从表中选择前 n 个最大值的有效方法,每种方法有其自身的优势和局限性。基于联合的方法简单而强大,而基于排名的方法在指定要检索的最大值的数量方面提供了灵活性。
以上是如何从 MySQL 表中检索按特定列分组的前 N 个最大值?的详细内容。更多信息请关注PHP中文网其他相关文章!