【问题标题】:Filter SQL query result set based on arbitrary time根据任意时间过滤 SQL 查询结果集
【发布时间】:2012-10-15 15:37:51
【问题描述】:

我目前正在运行以下 SQL fiddle

并且我正在努力使以下内容成为现实:

我只想要cats 的集合,该集合具有任意时间的last_checked 值并且是sick。为了讨论,让我们现在减 12 小时。 (sysdate - Interval '12' hour)。我要找回的是 11 小时前的 last_checkedcat,但 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 提供的仅检索第一个结果。我需要它以catcat 为基础。

第二次更新

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 答案已更新。逐只猫检查。

标签: sql database oracle


【解决方案1】:

您可以使用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;

【讨论】:

  • 好吧,我想这对多表选择也一​​样有效?
  • 这与我需要的非常接近,但是它只获得了集合中的第一个结果。我需要为每只猫使用此功能。有什么想法吗?
  • @Woot4Moo 编辑了 podiluska 的答案。这应该会让你得到一个猫一个猫的结果。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2022-01-26
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多