【发布时间】:2012-10-15 15:37:51
【问题描述】:
我目前正在运行以下 SQL fiddle
并且我正在努力使以下内容成为现实:
我只想要cats 的集合,该集合具有任意时间的last_checked 值并且是sick。为了讨论,让我们现在减 12 小时。 (sysdate - Interval '12' hour)。我要找回的是 11 小时前的 last_checked 的 cat,但 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;
适用于小型数据集。接受的答案(我使用的那个)将最有效地处理大型数据集。
【问题讨论】:
-
那么...您想要最近的状态,不管是在给定时间范围内生病的猫,还是健康猫的最近状态?
-
@Clockwork-Muse 在问题正文中做出了回应。
-
@Woot4Moo 答案已更新。逐只猫检查。