我目前正在运行以下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
将适用于小型数据集。接受的答案(我使用的答案)将最有效地用于大型数据集。
答案 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