时间戳数据类型上的Oracle max函数

时间:2018-12-04 04:50:47

标签: sql oracle timestamp

我想从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

由于所有日期都是相同的,但时间戳是不同的,因此max函数将所有3行都改为,我想查看每个ID的最新时间戳的最大日期,如下所示

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

在选择时,我希望每个ID看到1行,没有重复  从id_table中按ID选择MAX(updated_date)update_date,id;

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 :(得分:2)

您可以使用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;

Demo

奖金(对于Oracle 12c及更高版本):

select * from id_table 
ORDER BY updated_date DESC FETCH FIRST 1 ROWS ONLY

答案 1 :(得分:0)

如果要从表中获取最大值,则必须跳过谓词组。 您的group by谓词会指示Oracle为您提供每个组的最大值-在您的情况下,这是每个id的值。

尝试:

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

如图所示,timestamp列使用group by和合计函数可以完美地工作。