Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql选择前n个最大值_Mysql_Greatest N Per Group - Fatal编程技术网

mysql选择前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

如何从表中选择前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 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.idci.id-min 完整示例如下:

注意:请记住,在这两个位置都应执行其他约束,如性别=0。因此,如果您只想获得男性,那么您应该对内部和外部select应用约束,从MySQL 8.0/MariaDB支持开始,这是为此类操作设计的:

SELECT *
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-但不确定如何使其工作。这个答案拯救了生命。