像下表一样的数据,有重复的合同号,但是我只想保留同一合同号中回款金额最大的那一行,也就是图中红框里的数据。
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.`合同号`);