Sql Oracle-每个日期和日期/时间的最大值

Sql Oracle-每个日期和日期/时间的最大值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我有一个表,列日期和时间戳,值以秒为单位,并有类似的查询 桌子 2017-01-10 06:45:00 PM 1119 2017-01-10 03:30:00 PM 1054 2017-01-11 11:15:00 PM 379 2017-01-10 06:30:00 PM 377 2017-01-11 09:15:00 PM 375 质疑 这将提供所有记录,如果我添加 select * from Query1 --(above) where rownum <1 order b

我有一个表,列日期和时间戳,值以秒为单位,并有类似的查询

桌子

2017-01-10 06:45:00 PM  1119
2017-01-10 03:30:00 PM  1054
2017-01-11 11:15:00 PM  379
2017-01-10 06:30:00 PM  377
2017-01-11 09:15:00 PM  375
质疑

这将提供所有记录,如果我添加

select * from
Query1 --(above)
where rownum <1 order by Wait_sec desc, Datadt desc; 

试着这样做:

Select *
From (
    Select t.*,
      Row_number() over(partition by trunc(datecol) order by value desc nulls last) rn
    From yourtable t
) where rn = 1;

它根据值列的降序在日期内分配行号,然后过滤以获得第一行。下面的解决方案使用分组、
MAX()
聚合函数和
first/LAST
函数(使用
KEEP density\u RANK
)。如果某个日期多次达到相同的最高值,则会选择当天第一次达到该值的时间

with
     test_data( dt, val ) as (
       select to_date('2017-01-10 06:45:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1119 from dual 
       union all
       select to_date('2017-01-10 03:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1054 from dual 
       union all
       select to_date('2017-01-11 11:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  379 from dual 
       union all
       select to_date('2017-01-10 06:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  377 from dual 
       union all
       select to_date('2017-01-11 09:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  375 from dual
     )
--  end of test data; SQL query begins below this line (use actual table and column names)
select min(dt) keep(dense_rank last order by val) as dt, max(val) as val
from   test_data
group by trunc(dt)
order by dt   --  if needed
;

DT                            VAL
---------------------- ----------
2017-01-10 06:45:00 PM       1119
2017-01-11 11:15:00 PM        379

2 rows selected.

@不。OP想要得到最大值的行。@GurV。。非常感谢。。完美的解决方案:)您正在显示一个包含两列的表(不显示它们的名称)。但是您可以从中访问四列(HrName、DtTm、MaxSec和HrID)。这使得你很难理解你的查询在做什么以及你希望它做什么。我认为OP在帖子中显示的查询输出应该是他请求帮助的输入。尽管如此,该查询的输出仍然显示了三列(除了datetime和值之外还有一个ID)。现在还不清楚他到底想用那个身份证做什么。
Select *
From (
    Select t.*,
      Row_number() over(partition by trunc(datecol) order by value desc nulls last) rn
    From yourtable t
) where rn = 1;
with
     test_data( dt, val ) as (
       select to_date('2017-01-10 06:45:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1119 from dual 
       union all
       select to_date('2017-01-10 03:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'), 1054 from dual 
       union all
       select to_date('2017-01-11 11:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  379 from dual 
       union all
       select to_date('2017-01-10 06:30:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  377 from dual 
       union all
       select to_date('2017-01-11 09:15:00 PM', 'yyyy-mm-dd hh:mi:ss AM'),  375 from dual
     )
--  end of test data; SQL query begins below this line (use actual table and column names)
select min(dt) keep(dense_rank last order by val) as dt, max(val) as val
from   test_data
group by trunc(dt)
order by dt   --  if needed
;

DT                            VAL
---------------------- ----------
2017-01-10 06:45:00 PM       1119
2017-01-11 11:15:00 PM        379

2 rows selected.