如何选择最大值为2列的行

问题描述 投票:2回答:2

我有一个像这样的表mysql:

CREATE TABLE prelevement (
  line int,
  facture varchar(30),
  date_op varchar(30),
  code_op varchar(30)
);

        insert into prelevement 
(line,facture,date_op,code_op)
values 
(1,'F1','2019-02-20','PREL'),
(2,'F1','2019-02-20','CART'),
(3,'F1','2019-02-20','REJE'),
(8,'F1','2019-02-19','PREL'),
(2,'F2','2019-02-15','PREL'),
(1,'F2','2017-01-25','PREL'),
(1,'F3','2018-02-25','REJ'),
(2,'F3','2018-02-25','CART');

对于每个事实,我试图从最新的'date_op'中选择具有最大'line'的行。所以从这个:

| line | facture | date_op    | code_op |
| ---- | ------- | ---------- | ------- |
| 1    | F1      | 2019-02-20 | PREL    |
| 2    | F1      | 2019-02-20 | CART    |
| 3    | F1      | 2019-02-20 | REJE    |
| 8    | F1      | 2019-02-19 | PREL    |
| 2    | F2      | 2019-02-15 | PREL    |
| 1    | F2      | 2017-01-25 | PREL    |
| 1    | F3      | 2018-02-25 | REJ     |
| 2    | F3      | 2018-02-25 | CART    |

我想得到这个结果:

| line | facture | date_op    | code_op |
| ---- | ------- | ---------- | ------- |
| 3    | F1      | 2019-02-20 | REJE    |
| 2    | F2      | 2019-02-15 | PREL    |
| 2    | F3      | 2018-02-25 | CART    |

我来过这个但是我不确定从哪里开始:

select p.* 
        from prelevement p inner join(
            select facture, max(date_op) as 'date' 
            from prelevement    
            group by facture) p1 on p.facture=p1.facture and p.date_op=p1.date;
mysql sql max aggregate
2个回答
1
投票

在MySQL中,您可以使用:

select p.*
from prelevement p
where (date_op, line) = (select date_op, line
                         from prelevement p2
                         where p2.facture = p.facture
                         order by date_op desc, line desc
                         limit 1
                        );

您也可以使用两个相关的子查询来执行此操作:

select p.*
from prelevement p
where p.date_op = (select max(p2.date_op)
                   from prelevement p2
                   where p2.facture = p.facture
                  ) and
     p.line = (select max(p2.line)
               from prelevement p2
               where p2.facture = p.facture and p2.date_op = p.date_op
              ) ;

在MySQL 8.0中,您可以使用窗口函数:

select p.*
from (select p.*, row_number() over (partition by facture order by date_op desc, line desc) as seqnum
      from prelevement p
     ) p
where seqnum = 1;

Here是所有三种解决方案的db <>小提琴。


0
投票

这可行:

CREATE TABLE prelevement (
  line int,
  facture varchar(30),
  date_op varchar(30),
  code_op varchar(30)
);
        insert into prelevement 
(line,facture,date_op,code_op)
values 
(1,'F1','2019-02-20','PREL'),
(2,'F1','2019-02-20','CART'),
(3,'F1','2019-02-20','REJE'),
(8,'F1','2019-02-19','PREL'),
(2,'F2','2019-02-15','PREL'),
(1,'F2','2017-01-25','PREL'),
(1,'F3','2018-02-25','REJ'),
(2,'F3','2018-02-25','CART');
select * from prelevement pp where facture in 
(
  select facture from (
    select * from prelevement p 
    where facture in ( 
      select facture from prelevement pin 
      group by facture
      having max(pin.date_op) = p.date_op 
    )
  ) t
  group by facture
  having max(t.line) = pp.line
) 
line | facture | date_op    | code_op
---: | :------ | :--------- | :------
   3 | F1      | 2019-02-20 | REJE   
   2 | F2      | 2019-02-15 | PREL   
   2 | F3      | 2018-02-25 | CART   

db <>小提琴here

© www.soinside.com 2019 - 2024. All rights reserved.