2017-08-20 6 views
-1

私はテーブルuser_statusを持っています。これは各ユーザのステータスを格納しています。ステータスが変わるたびにuser_statusテーブルにステータスが追加されます。各ユーザのテーブルから最新のレコードを取得

id status  created 
1 ACTIVE  08-10-2017 08:21:22 
1 ACTIVE  08-10-2017 08:21:25 
1 NON_ACTIVE 08-10-2017 08:22:23 
2 NON_ACTIVE 08-10-2017 08:22:23 
2 ACTIVE  08-11-2017 08:25:23 
3 NON_ACTIVE 08-12-2017 08:23:23 

は ので、私は探しています出力も一度

id status  created 
1 NON_ACTIVE 08-10-2017 08:22:23 
2 ACTIVE  08-11-2017 08:25:23 
3 NON_ACTIVE 08-12-2017 08:23:23 

作成された日付に基づいて、各ユーザのための最後の状態である私は何を探していますがされて私は、私はまたに興味を持っていることですか

ですOFR

はので、この照会の出力は、私が探していた各ユーザーのステータス(最後の前に、1)最後のステータスに2番目を取得する方法があるかどうかを知ります

任意の提案、I

+0

これまでに何を試しましたか? – tima

答えて

0

ウィンドウが救助する機能!

select t.* 
from (select t.*, 
      row_number() over (partition by id order by created desc) as seqnum, 
      nth_value(status, 2) over (partition by id order by created desc) as second_status 
     from t 
    ) t 
where seqnum = 1; 

あなたはすべての列をしたくない場合は、条件付きの集約を使用することができますが:

select t.id, max(t.created) as created, 
     max(case when seqnum = 1 then status end) as last_status, 
     max(case when seqnum = 2 then status end) as second_status, 
from (select t.*, 
      row_number() over (partition by id order by created desc) as seqnum 
     from t 
    ) t 
group by id; 
+0

匿名のdownvoteが正解のように見える理由は何ですか? –

+0

私は誰がdownvoteをしたのかわかりません、私はまだあなたのクエリを把握しています。私は誰がdownvote – user641887

+0

@ user641887をしたかわからない。 。 。それは単に質問とすべての答えを下落させた悪意のあるダウン者のように見えます。 –

0

あなたのクエリを見てみると、私はむしろ最初の取得よりも、一度で詳細を取得することをお勧めステータスを表示してから2番目のステータスに進みます。スニペットの下にこれが役立つことを願っています。

SELECT B.ID, 
    B.STATUS, 
    B.CREATED 
FROM 
    (SELECT A.ID, 
    A.STATUS, 
    CREATED, 
    ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.CREATED DESC) RN 
    FROM 
    (SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:22' CREATED FROM DUAL 
    UNION ALL 
    SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:25' CREATED FROM DUAL 
    UNION ALL 
    SELECT 1 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 2 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 2 ID,'ACTIVE' STATUS,'08-11-2017 08:25:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 3 ID,'NON_ACTIVE' STATUS,'08-12-2017 08:23:23' CREATED FROM DUAL 
    )A 
)B 
WHERE B.RN IN (1,2); 
/
関連する問題