mysql去重取最大值,逻辑类似oracle的over(partition by)函数

    像下表一样的数据,有重复的合同号,但是我只想保留同一合同号中回款金额最大的那一行,也就是图中红框里的数据。


oracle方法:

    在oracle中,我们可以简单地用over(partition by)函数处理(代码示例如下),解释一下就是利用partition by函数按照合同号分区,在每个分区内再利用order by根据回款金额排序,where num=1的意思就是取每个分区中排序第一的那一行。

select 
row_number()over(partition by 合同号 order by 回款金额 desc) as num
from  test  where num=1

mysql方法:

    但是在mysql中并没有这样的函数,我们需要重新写逻辑(代码如下),老规矩解释一下:第二个select函数是关键所在,功能就是,当a.`合同号` = b.`合同号`时,我们取出最大的回款金额,当a.`回款金额`等于这个最大的回款金额时,我们认为这一行符合条件并取出,因此a中的每个合同号我们都要执行一次第二个select函数,来判断当前合同号的这一行是否是最大回款金额的这一行。

SELECT  a.`合同号`,  a.姓名,  a.`回款金额`
FROM test a    WHERE a.`回款金额` = 
(SELECT  MAX(b.`回款金额`)    FROM test b     WHERE a.`合同号` = b.`合同号`);

   运行结果:

    


去重取最小值:

     如果是去重取最小值,那么代码如下,简单地说就是oracle【改升序为降序】,mysql【改最大值为最小值】。

#oracle
select 
row_number()over(partition by 回款金额 order by 回款金额 ASC) as num
from  test
#mysql
SELECT   a.`合同号`,  a.姓名,   a.`回款金额`
FROM  test a    WHERE a.`回款金额` = 
(SELECT   MIN(b.`回款金额`)   FROM test b     WHERE a.`合同号` = b.`合同号`);

猜你喜欢

转载自blog.csdn.net/weixin_40683253/article/details/80824625
今日推荐