我有一个包含列的表格: STARTDATE、ENDDATE、ID、A、B、C(图片名称不同,但思路相同)
开始日期和结束日期跨越多天,并包括每小时的数据。此外,每个开始日期/结束日期都有多个 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));
最佳答案
您可以尝试使用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;
关于sql - 获取最大值,同时保留 SQL 中的其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25394846/