SQL - Как выбрать последнюю доступную запись для каждой даты в заданном диапазоне - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть таблица (DATA_RECORDS) в базе данных, которая содержит несколько записей на одну и ту же дату, но в разное время, начиная с 2015-2018 гг.То, что я пытаюсь сделать, это выбрать все записи в заданном диапазоне дат, а затем выбрать самую последнюю запись, доступную для каждой даты.Текущий код, который я использую в SQL:

SELECT NAME, DATE_LOADED, R_ID 
    FROM DATA_RECORDS 
    WHERE ((DATE_LOADED>=to_date('01/12/2018 00:00:00', 'dd/mm/yyyy HH24:MI:SS'))
    AND (DATE_LOADED<=to_date('31/12/2018 23:59:59', 'dd/mm/yyyy HH24:MI:SS')))
    ORDER BY DATE_LOADED DESC;

Где имена столбцов: «NAME», «DATE_LOADED» и «R_ID».Вышеприведенное дает следующие результаты:

NAME      |DATE_LOADED         |R_ID
-------------------------------------
RECORD_1  |31/12/2018 17:36:38 |1234
RECORD_2  |31/12/2018 10:15:11 |1235
RECORD_3  |30/12/2018 16:45:23 |1236
RECORD_4  |30/12/2018 09:06:54 |1237
RECORD_5  |30/12/2018 07:53:30 |1238

и т. Д. ... Как вы можете видеть, количество загрузок в день также не одинаково.

Я хочу выбрать

NAME      |DATE_LOADED         |R_ID
-------------------------------------
RECORD_1  |31/12/2018 17:36:38 |1234
RECORD_3  |30/12/2018 16:45:23 |1236

Я очень плохо знаком с SQL, поэтому любая помощь будет принята.

Примечание: я использую Oracle SQL Developer и у меня есть только доступ только для чтения к базе данных, поэтому яне может создавать новые таблицы или изменять текущую таблицу.

Ответы [ 2 ]

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

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

select * from tablename a where date in
   (select max(DATE_LOADED) from tablename b where cast(a.DATE_LOADED as date)=cast(b.DATE_LOADED as date)) and 
   ((DATE_LOADED>=to_date('01/12/2018 00:00:00', 'dd/mm/yyyy HH24:MI:SS'))
    AND (DATE_LOADED<=to_date('31/12/2018 23:59:59', 'dd/mm/yyyy HH24:MI:SS')))
0 голосов
/ 25 февраля 2019

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

SELECT NAME, DATE_LOADED, R_ID 
FROM DATA_RECORDS 
WHERE DATE_LOADED >= DATE '2018-01-12' AND
      DATE_LODED < DATE '2018-12-31'
ORDER BY DATE_LOADED DESC;

Тогда простой метод - ROW_NUMBER() - наряду с извлечением только даты из значения даты / времени:

SELECT NAME, DATE_LOADED, R_ID
FROM (SELECT NAME, DATE_LOADED, R_ID ,
             ROW_NUMBER() OVER (PARTITION BY TRUNC(DATE_LOADED) ORDER BY DATE_LOADED DESC) as seqnum
      FROM DATA_RECORDS 
      WHERE DATE_LOADED >= DATE '2018-01-12' AND
            DATE_LODED < DATE '2018-12-31'
     ) dr
WHERE seqnum = 1
ORDER BY DATE_LOADED DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...