Функция Oracle max на типе отметки времени - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу взять максимальную дату из типа данных временной метки в oracle

мои данные выглядят так

id  updated_date
--  -------------------
1   2011-12-21 10:34:24 
1   2011-12-21 09:52:15
1   2011-12-21 10:02:49

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

Select MAX(updated_date) update_date, id FROM id_table group by id;
id  updated_date
--  -------------------
1   2011-12-21 10:34:24 

заранее спасибо

Таблица в 10000 плюс строки, данные выглядят как ниже

 id  updated_date
 --  -------------------
 1   2011-12-21 10:34:24 
 1   2011-12-21 09:52:15
 1   2011-12-21 10:02:49
 2   2011-13-21 10:34:24 
 2   2011-13-21 09:52:15
 2   2011-13-21 10:02:49
 3   2011-14-21 10:34:24 
 3   2011-14-21 09:52:15
 3   2011-14-21 10:02:49

При выборе я хочу видеть 1 строку для идентификатора без дубликатов Выберите MAX (updated_date) update_date, id ИЗ группы id_table по идентификатору;

id  updated_date
 --  -------------------
 1   2011-12-21 10:34:24 
 2   2011-13-21 10:34:24 
 3   2011-14-21 10:34:24 

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать агрегатную функцию FIRST или row_number().

1.

SELECT MAX(id) KEEP(DENSE_RANK FIRST ORDER BY updated_date DESC) AS id,
       MAX(updated_date) update_date
FROM id_table;

2.

SELECT id,
       updated_date
FROM (
     SELECT i.*,
            ROW_NUMBER() OVER(
                 ORDER BY updated_date DESC
            ) AS rn
     FROM id_table i
)
WHERE rn = 1;

Демоверсия

Бонус (для Oracle 12c и выше):

select * from id_table 
ORDER BY updated_date DESC FETCH FIRST 1 ROWS ONLY
0 голосов
/ 04 декабря 2018

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

Попробуйте это:

Select MAX(updated_date) update_date FROM id_table

Проведите небольшой тест по этому вопросу.проблема

create table test_ts_1 (tst_id number , my_timestamp timestamp); 

declare
begin
  for i in 1..10000 loop
    for j in 1..10 loop
      insert into test_ts_1 (tst_id, my_timestamp) values (i, systimestamp); 
    end loop; 
  end loop; 
end; 
/

select tst_id, max(my_timestamp), min(my_timestamp) from test_ts_1 group by tst_id order by tst_id asc; 
***********************************
1   04.12.2018 23.01.31,364979000   04.12.2018 23.01.31,364322000
2   04.12.2018 23.01.31,365596000   04.12.2018 23.01.31,365032000
3   04.12.2018 23.01.31,366284000   04.12.2018 23.01.31,365662000
4   04.12.2018 23.01.31,366890000   04.12.2018 23.01.31,366350000
5   04.12.2018 23.01.31,367468000   04.12.2018 23.01.31,366942000
6   04.12.2018 23.01.31,368050000   04.12.2018 23.01.31,367518000
7   04.12.2018 23.01.31,368728000   04.12.2018 23.01.31,368118000
8   04.12.2018 23.01.31,369366000   04.12.2018 23.01.31,368797000
9   04.12.2018 23.01.31,369992000   04.12.2018 23.01.31,369430000
10  04.12.2018 23.01.31,370713000   04.12.2018 23.01.31,370055000
11  04.12.2018 23.01.31,371395000   04.12.2018 23.01.31,370784000
12  04.12.2018 23.01.31,372117000   04.12.2018 23.01.31,371470000
13  04.12.2018 23.01.31,372843000   04.12.2018 23.01.31,372174000
14  04.12.2018 23.01.31,373635000   04.12.2018 23.01.31,372919000
15  04.12.2018 23.01.31,374391000   04.12.2018 23.01.31,373710000
16  04.12.2018 23.01.31,375176000   04.12.2018 23.01.31,374467000

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

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