我有一个像这样的表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中,您可以使用:
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 <>小提琴。
这可行:
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