Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 选择除每个不同客户的最大订单之外的所有订单_Mysql_Sql - Fatal编程技术网

Mysql 选择除每个不同客户的最大订单之外的所有订单

Mysql 选择除每个不同客户的最大订单之外的所有订单,mysql,sql,Mysql,Sql,很抱歉格式不好,但作为一个更大问题的一部分,我创建了一个生成此表的查询: id id2 4 7 4 6 1 3 1 2 1 1 如何提取每个id1没有最高id2的行 我想要的是: id id2 4 6 1 2 1 1 我似乎只知道如何从整体上消除MaxID2,但不能针对每个不同的id1。如果您能帮助区分每个id1的最大id2,我们将不胜感激。您可以尝试下面的方法- select a.id, a.id2 from

很抱歉格式不好,但作为一个更大问题的一部分,我创建了一个生成此表的查询:

id id2    
4  7    
4  6    
1  3    
1  2    
1  1
如何提取每个id1没有最高id2的行

我想要的是:

id id2    
4  6    
1  2    
1  1

我似乎只知道如何从整体上消除MaxID2,但不能针对每个不同的id1。如果您能帮助区分每个id1的最大id2,我们将不胜感激。

您可以尝试下面的方法-

select a.id, a.id2 
from tablename a
where a.id2 <> (select max(a1.id2) from tablename a1 where a.id=a1.id)

如果您使用的是MySQL 8+,那么RANK提供了一个选项:

WITH cte AS (
    SELECT id, id2, RANK() OVER (PARTITION BY id ORDER BY id2 DESC) rnk
    FROM yourTable
)

SELECT id, id2
FROM cte
WHERE rnk > 1
ORDER BY id DESC, id2 DESC;

代替where中的相关子查询,您可以离开JOIN并应用notin

select id, id2 
   from yourTable YT
      LEFT JOIN 
      ( select id, max( id2 ) highestID2
           from YourTable 
           group by id ) TopPerID
         on YT.ID = TopPerID.ID
         AND YT.ID2 != TopPerID.highestID2
   where TopPerID.id IS NULL
由于id值只能有一个id2值,因此还需要检查这种情况,可以通过比较联接中的MAXid2值和MINid2值来执行此操作:


如果一个id1只有一个id2值怎么办?它将输出具有该id2值的行
SELECT t1.*
FROM Table1 t1
JOIN (SELECT id, MAX(id2) AS max_id2, MIN(id2) AS min_id2
      FROM Table1
      GROUP BY id) t2 ON t2.id = t1.id 
                     AND (t1.id2 < t2.max_id2 OR t2.min_id2 = t2.max_id2)
id  id2
4   6
1   2
1   1
2   5