mysql选择前n个最大值
如何从表中选择前n个最大值 对于这样的表:mysql选择前n个最大值,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,如何从表中选择前n个最大值 对于这样的表: column1 column2 1 foo 2 foo 3 foo 4 foo 5 bar 6 bar 7 bar 8 bar 对于n=2,结果需要为: 3 4 7 8 下面的方法仅为每个组选择最大值 SELECT max(column1) FROM table GROUP
column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar
对于n=2,结果需要为:
3
4
7
8
下面的方法仅为每个组选择最大值
SELECT max(column1) FROM table GROUP BY column2
返回:
4
8
对于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,您都可以使用描述的方法来模拟分区上的秩
编辑:
事实上,这篇文章会给你你所需要的
基本上是这样的
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替换为包含值的列的名称
从最内部的查询一步一步地计算it函数并运行它们
此外,还有一点简化——如果某个类别没有足够的值,则查找mid的子查询可以返回NULL,因此应该将该值合并到某个常量,这在比较中是有意义的。在您的案例中,它是val域的最小值,在文章中,它是最大值
编辑2:
我忘了提到限制2,1决定n限制n,1。如果您使用的是mySQl,为什么不使用限制功能? 按降序对记录进行排序,并限制最前面的n,即:
SELECT yourColumnName FROM yourTableName
ORDER BY Id desc
LIMIT 0,3
这就是我在MySQL中获得每个组N最大行数的方法
SELECT co.id, co.person, co.country
FROM person co
WHERE (
SELECT COUNT(*)
FROM person ci
WHERE co.country = ci.country AND co.id < ci.id
) < 1
;
工作原理:
自联接到表
分组由co.country=ci.country完成
每组N个元素由<1控制,因此对于3个元素-<3
获取最大值或最小值取决于:co.idSELECT *
FROM (SELECT *,ROW_NUMBER() OVER(PARTITION BY column2 ORDER BY column1 DESC) AS r
FROM tab) s
WHERE r <= 2
ORDER BY column2 DESC, r DESC;
你需要n=2的解决方案还是任意n的一般解决方案?我实际上更新了解决方案-如果你想进一步解释它是如何工作的,但你不能从文章中计算出来,请让我知道。@Unreason,非常感谢你的解决方案,它工作得很好,解释非常清楚所有的积分都应该到Quassnoi的伟大博客上,如果你打算对相当大的数据集运行查询,你应该阅读有关性能的详细信息mysql有时需要一些帮助,这就是其中的一种情况。好的一点,这带来了问题。如果我只想在最大值上检索,那么可能会有多个呢?我尝试过类似select maxx的方法,其中maxx=select-top values-但不确定如何使其工作。这个答案拯救了生命。