2

現在、次のSQLフィドルを実行しています

そして、次のことを真にしようとしています:

任意の時間の値をcats持ち、である のセットのみが必要です。議論のために、マイナス 12 時間にしましょう。( )。私が戻ってきたのは11時間前のことですが、それは彼がもう病気ではないというより最近の状態です. 古いエントリを無視し、新しいステータスだけに関心を持つようにクエリを作成するにはどうすればよいですか? つまり、猫はもう病気ではないので、この結果を無視するということです。last_checkedsicksysdate - Interval '12' hourcatlast_checkedcatsickhealthy

質問

では、指定された期間に病気になった猫のみの最新のステータス、または健康な猫のみの最新のステータスが必要ですか?

ステータスが最新 (最大) であり、ステータスも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

2 回目の更新

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 に答える