Как получить последнюю дату из двух столбцов в MySQL Workbench? - PullRequest
0 голосов
/ 02 мая 2020

У меня таблица выглядит следующим образом:

ID   B     C      date01        date02
11  xxx   xxxx   2020-05-01    2020-05-02
11  xxx   xxxx   2020-05-01    2020-05-03
11  xxx   xxxx   2020-05-01    2020-05-01
11  xxx   xxxx   2020-02-03    2020-02-08
11  xxx   xxxx   2020-02-03    2020-02-31
22  xxx   xxxx   2020-05-01    2020-05-02
22  xxx   xxxx   2020-05-01    2020-05-03
22  xxx   xxxx   2020-05-01    2020-05-01
22  xxx   xxxx   2020-02-03    2020-02-08
22  xxx   xxxx   2020-02-03    2020-02-31

Я хочу вернуть все, но с самой последней датой date01 & date02 для каждого идентификатора, ожидаемый вывод:

11  xxx   xxxx   2020-05-01    2020-05-03
22  xxx   xxxx   2020-05-01    2020-05-03

Я попробовал это:

SELECT 
    ID, B, C, date01, date02
FROM 
    table
order by date01 desc
GROUP BY ID 

но это дало мне: Error Code: 1064. You have an error in your SQL syntax

Я очень плохо знаком с SQL и все еще учусь, Что я сделал не так? Может кто-то помочь мне с этим? Заранее спасибо.

Обновление: я забыл об ограничении, некоторые date01 позже date02, мне нужна только дата, когда date01 раньше date02.

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Один метод является коррелированным подзапросом:

select t.*
from t
where greatest(t.date1, t.date2) = (select max(greatest(t1.date1, t2.date2))
                                    from t t2
                                    where t2.id = t.id
                                   );

Другой альтернативой являются оконные функции:

select t.*
from (select t.*,
             row_number() over (partition by id order by greatest(t1.date1, t2.date2) desc) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 02 мая 2020

На MySQL 8+, я бы использовал здесь функции analyti c:

WITH cte AS (
    SELECT *, MAX(date01) OVER (PARTITION BY ID) max_date01,
        MAX(date02) OVER (PARTITION BY ID) max_date02
    FROM yourTable
)

SELECT *
FROM yourTable
WHERE date01 = max_date01 AND date02 = max_date02;
0 голосов
/ 02 мая 2020

Вы хотите "агрегировать" по id. Вы можете использовать MAX(), чтобы получить самые последние даты, например:

select
  id, 
  max(b),
  max(c),
  max(date01),
  max(date02)
from t
group by id
...