2016-05-10 7 views
0

の間でカテゴリ内の最新のエントリを選択します。SQL私はSQLテーブルを持っている目に見える

DATE USER  FLAGGED COMMAND 
1  Alice 0   sudo gparted 
2  Bob  1   sudo 
3  Bob  0   mv 
4  Alice 1   sudo rm -rf  
5  Charlie 1   sudo chown  

私は最後の選択したい私は

select DATE, USER, REQUEST 
from 
(

select DATE, USER, REQUEST, FLAGGED 
row_number() over(partition by USER order by date desc) rn 
from USERDATA 
) src 
where rn = 1 and FLAGGED = 1 
を試みたユーザー

DATE USER  FLAGGED COMMAND  
2  Bob  1   sudo  
4  Alice 1   sudo rm -rf 
5  Charlie 1   sudo chown 

のアクションをフラグを立て

ですが、Bobを省略します。どのようにすることができますか?SQL要求に "FLAGGED = 1"を追加する正しい方法は何ですか?

+0

フラグが付いた行が1であるため、ボブが省略されます。日付で注文した場合、そのユーザーの2番目の文字です – Lamak

+0

'(日付順に並べ替えるユーザーの注文、フラグ付きdesc)rn' –

答えて

0

ここでは、まずユーザーの最新のエントリを選択し、フラグが設定されていないエントリを削除します。代わりに、最初にFLAGGEDであるすべての項目を選択して、それらの最新項目を見つける必要があります。このコードはうまくいくはずです。あなたはまた、一般的なMAXクエリを使用することができます

select DATE, USER, REQUEST 
from 
    (
    select DATE, USER, REQUEST, FLAGGED 
    row_number() over(partition by USER order by DATE desc) rn 
    from USERDATA WHERE FLAGGED = 1 
) src 
where rn = 1 
1

フラグ付き条件をサブクエリに移動すると、フラグが1の行のみが取得され、最新のrn = 1条件を選択できます。

select DATE, USER, REQUEST 
from 
(
select DATE, USER, REQUEST, FLAGGED, 
row_number() over(partition by USER order by date desc) rn 
from USERDATA 
where flagged = 1 
) src 
where rn = 1 
+0

あなたはとても速いです – Stepan

1

select DATE, USER, REQUEST 
from USERDATA 
WHERE (date, user) IN (
    select MAX(DATE) as date, USER 
    from USERDATA 
    where flagged = 1 
    group by user 
) 
AND flagged = 1 

をただし、MAXで同じ日付を持つ2つのユーザーエントリが存在する場合、これは重複を返す場合があることに注意してください。..これを回避するには、外側のSELECTでMINまたはMAXを使用します。

関連する問題