Как выбрать строки с максимальными значениями 2 столбцов - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть таблица 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;

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это будет работать:

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   

дБ <> скрипка здесь

0 голосов
/ 21 февраля 2019

В 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 <> для всех трех решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...