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.