获取最大值,同时保留SQL中的其他列

时间:2014-08-20 00:01:11

标签: sql oracle-sqldeveloper

我有一个包含列的表格: STARTDATE,ENDDATE,ID,A,B,C(图片显示不同的名称,但想法是相同的)

startdate和enddate持续多天,包括每小时的数据。此外,对于每个startdate / enddate,还有多个ID。表格的一部分示例:

http://i58.tinypic.com/300qsn4.png

我想要做的是获取值C的每个ID的每日最大值,并保留每日最大值出现的行中的其他值。

到目前为止,我正在做这样的事情,但对于这个非常大的数据集,这通常会超时:

select * from table
where (Startdate, Enddate, ID, A, B, C) not in(select * from table
where (ID, C) not in(select ID, max(C) from table group by ID));

1 个答案:

答案 0 :(得分:2)

您可以尝试使用row_number()。假设您可以使用startdate作为日期指示符:

select t.*
from (select t.*,
             row_number() over (partition by id, trunc(startdate) order by c desc) as seqnum
      from table t
     ) t
where seqnum = 1;

如果您需要在一段时间内完成此操作,我建议您加入数字以获取不同的日期并加入以获取每个日期的值。例如,如果记录的时间跨度不超过9天:

with nums as (
      select level - 1 as n
      from dual
      connect by level <= 10
)
select t.*
from (select t.*,
             row_number() over (partition by id, trunc(startdate + n.n) order by c desc) as seqnum
      from table t join
           nums
           on startdate + nums.n <= enddate
     ) t
where seqnum = 1;