繁体   English   中英

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

[英]How to select rows with max values of 2 columns

我有一个像这样的表 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 | 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;

是所有三个解决方案的 db<>fiddle。

这会起作用:

 CREATE TABLE prelevement ( line int, facture varchar(30), date_op varchar(30), code_op varchar(30) );
\n \n
 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');
\n \n
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 )
\n线| 制造 |  date_op | 代码操作\n ---: |  :------ |  :--------- |  :------\n    3 |  F1 |  2019-02-20 | 拒绝   \n    2 |  F2 |  2019-02-15 | 预研   \n    2 |  F3 |  2018-02-25 | 大车   \n

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM