2

我目前正在运行以下 SQL小提琴

并试图使以下内容成为现实:

我只希望这组cats具有last_checked任意时间的值并且是sick. 为了讨论,让我们现在减 12 小时。( sysdate - Interval '12' hour)。我得到的catlast_checked11 小时前cat的情况,但现在他不再生病了。如何以忽略旧sick条目而只关注新healthy状态的方式构建查询?我的意思是忽略这个结果,因为猫不再生病。

问题

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

如果它是最新的(最大)并且状态也是 ,我只希望将状态返回给我sick。在小提琴中,它将显示一个我不希望发生的示例,它将返回带有时间戳的生病状态,11 hours ago但有一个更新的时间戳。

更新

以下功能:

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;

@podiluska 提供的仅检索第一个结果。我需要它在cat基础cat上。

第二次更新

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;

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

4

2 回答 2

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;
于 2012-10-15T15:42:21.737 回答
0

好的,如果其他人遇到与我相同的情况,您不想使用分析函数,尤其是当您的数据像我的那样超过 5 亿条记录时。您要做的是将分析查询展开为具有以下形式的 sql 语句:

select colA,colB,...  
from  
(  
     select col1,col2,...
     from tables  
     where ...
)  results  
where ...
group by colA,colB
于 2012-10-19T18:36:07.313 回答