Показать максимальную дату, которая меньше определенной даты, но максимальная среди оставшейся группы данных - PullRequest
0 голосов
/ 14 февраля 2019

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

Я создал временную таблицу и добавил к ней Id и соответствующую дату, теперь я пытаюсь сравнить дату в таблице с конкретной датой, в то же время выбирая ID и Max Date в select, но, к сожалению, вместо этого я получаю несколько строк,Я ищу строку с максимальным временем по прошествии указанного времени

create table temp_test (id varchar2(20),tmstmp date);

Случайная вставка по запросу ниже с данными

insert into temp_test values (10, sysdate);

Вывод запроса выбора

ID      TMSTMP
--  -------------------
15  2019-02-15 20:29:31
10  2019-02-15 20:25:51
11  2019-02-15 20:26:00
12  2019-02-15 20:26:08
13  2019-02-15 20:26:16
10  2019-02-15 20:26:22

Теперь я пытаюсь выполнить приведенный ниже запрос

select id, max(TMSTMP) from temp_test
where TMSTMP <  TO_DATE('2019-02-15 20:28:00', 'YYYY-MM-DD HH24:MI:SS')
group by id;

Полученный результат похож на - Фактический результат

ID      TMSTMP
--  -------------------
13  2019-02-15 20:26:16
11  2019-02-15 20:26:00
12  2019-02-15 20:26:08
10  2019-02-15 20:26:22

Но я искал полученный результат, как показано ниже, так как этомаксимальное время по истечении указанного времени

ID      TMSTMP
--  -------------------
10  2019-02-15 20:26:22

Любое другое решение действительно приветствуется. Спасибо

Небольшое редактирование ответа Джона,

что можно сделать, если у меня есть другой столбец с именем name, и я хочу применить к нему пример фильтра;

select *
from temp_test
where name ='TOM' and tmstmp = (select max(tmstmp) 
            from temp_test 
            where name ='TOM' and tmstmp < TO_DATE('2019-02-15 20:28:00', 
'YYYY-MM-DD HH24:MI:SS'))

Возможно ли здесь удаление дублирующегося сравнения?

1 Ответ

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

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

with CTE as
(
select id, tmstmp, row_number() over (order by tmstmp desc) as rn
from temp_test
where tmstmp < TO_DATE('2019-02-15 20:28:00', 'YYYY-MM-DD HH24:MI:SS')
)
select *
from CTE
where rn = 1

или

select *
from temp_test
where tmstmp = (select max(tmstmp) 
                from temp_test 
                where tmstmp < TO_DATE('2019-02-15 20:28:00', 'YYYY-MM-DD HH24:MI:SS'))

Если вы группируете по id, то max (tmstmp) будетбыть максимальным для каждого заданного идентификатора (группировки)

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