показывать только последние записи за каждый день - PullRequest
1 голос
/ 21 апреля 2020

У меня есть следующая таблица

ID    apiDate                   totalCases
1     2020-04-18 12:00:00       10
2     2020-04-18 12:00:00       15
3     2020-04-19 12:00:00       20
4     2020-04-19 12:00:00       25      
5     2020-04-19 12:00:00       30
6     2020-04-20 12:00:00       35
7     2020-04-20 12:00:00       40
8     2020-04-20 12:00:00       45  

Я хочу вернуть последнюю запись для каждого дня следующим образом

ID    apiDate                   totalCases
2     2020-04-18 12:00:00       15     
5     2020-04-19 12:00:00       30
8     2020-04-20 12:00:00       45  

Я добавил еще один столбец с именем dateonly и достиг мое требование

SELECT 
    *
FROM 
    myTable H
WHERE
    `apiDate` = 
    (
        SELECT 
            max(`apiDate`) 
        FROM 
            myTable
        WHERE
            `dateonly` = H.dateonly
    )

Я ищу правильное решение без добавления столбца «dateonly»

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Ваше решение, использующее коррелированный подзапрос для фильтрации, почти готово. Вам просто нужно исправить условие корреляции, чтобы оно совпадало с днем, а не со всей датой и временем .

Я бы написал это как:

select t.*
from mytable t
where t.apidate = (
    select max(t1.apidate)
    from mytable t1
    where t1.apidate >= date(t.apidate) and t1.apidate < date(t.apidate) + interval 1 day
)
0 голосов
/ 21 апреля 2020

Вы рассматривали оконную функцию?

select ID, apiDate, totalCases
from (select t.*,
             row_number() over (partition by date(apidate) order by apidate desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;
...