Как отфильтровать, сравнив даты в MySQL Workbench - PullRequest
1 голос
/ 04 мая 2020

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

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

Я хочу вернуть все, но с самой последней датой из этих трех дат для каждого идентификатора, а date02 не может быть позже date03, мой текущий вывод будет дайте мне это где date02> date03:

11  xxx   xxxx   2020-07-01    2020-07-03   2020-06-30

Ожидаемый результат:

11  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30
22  xxx   xxxx   2020-07-01    2020-06-03   2020-06-30

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

SELECT 
    id,
    B,
    C,
    max(date01),
    max(date02), 
    max(date03),  
FROM 
    table
WHERE
    'date02' < 'date03'
GROUP BY id

Я добавил WHERE 'date02' < 'date03', но почему на выходе все еще есть записи, где date02> date03 ?? Я очень новичок в SQL, пожалуйста, помогите ...

1 Ответ

1 голос
/ 04 мая 2020

Вы можете сделать это с коррелированным подзапросом и равенством кортежей:

select t.*
from mytable t
where (t.date01, t.date02, t.date03) = (
    select t1.date01, t1.date02, t1.date03 
    from mytable t1 
    where t1.id = t.id
    order by t1.date01 desc, t1.date02 desc, t1.date03 desc
    limit 1
)

Для выполнения этого запроса вы можете создать составной индекс для (id, date01, date02, date03).

. Вы также можете используйте row_number(), если вы работаете MySQL 8.0:

select *
from (
    select 
        t.*, 
        row_number() over(partition by id order by date01 desc, date02 desc, date03 desc) rn
    from mytable t
) t
where rn = 1

Демонстрация на DB Fiddle :

ID | B   | C    | date01     | date02     | date03    
-: | :-- | :--- | :--------- | :--------- | :---------
11 | xxx | xxxx | 2020-07-01 | 2020-07-03 | 2020-06-30
22 | xxx | xxxx | 2020-07-01 | 2020-07-03 | 2020-06-30
...