根据任意时间过滤SQL查询结果集

时间:2012-10-15 15:37:52

标签: sql database oracle

我目前正在运行以下SQL fiddle

我试图让以下内容成立:

我只希望cats的{​​{1}}值具有某个任意时间且last_checked。为了讨论起见,现在让它减去12小时。 (sick)。我得到的回报是sysdate - Interval '12' hour 11小时前的cat,但last_checked现在的状态更近,他不再生病了。如何以这样的方式构造查询:忽略旧的cat条目并仅关注新的sick状态?我的意思是忽略这个结果,因为猫不再生病了。

问题

  

所以...你想要最近的状态,不管是最近的状态   只有那些在给定时间内生病的猫的状态,   还是只有健康的猫?

我只希望状态在最近(最大)时返回给我,状态也是healthy。在小提琴中,它将显示一个我不想发生的例子,它将返回病态状态,时间戳为sick,但有一个更新的。

更新

以下功能:

11 hours ago
@podiluska提供的

仅检索第一个结果。我需要它以select cat_id, last_checked, sick from ( select cat_id, last_checked, sick, ROW_NUMBER() over (partition by cat_id order by last_checked desc) rn from cats where last_checked >= sysdate- INTERVAL '12' hour ) v where rn = 1 and sick = 1; cat为基础。

第二次更新

Podiluska提供的解决方案:

cat

将适用于小型数据集。接受的答案(我使用的答案)将最有效地用于大型数据集。

2 个答案:

答案 0 :(得分:2)

您可以使用Row_Number()窗口功能获取最新更新...

select cat_id, last_checked, sick
from
(
    select cat_id, last_checked, sick,
             ROW_NUMBER() over (partition by cat_id order by last_checked desc) rn
    from cats
    where last_checked >= sysdate- INTERVAL '12' hour
) v
where rn = 1;

答案 1 :(得分:0)

好的,如果其他人遇到我所做的同样情况,你不想使用分析功能,特别是当你的数据是>我的5亿条记录。您要做的是将分析查询打包到具有以下格式的sql语句中:

select colA,colB,...  
from  
(  
     select col1,col2,...
     from tables  
     where ...
)  results  
where ...
group by colA,colB