2017-02-13 27 views
0

私は複雑なデータベースルールをテストしており、以下のシナリオをテストするロジックを策定するのに役立つ必要があります。ランクに基づいてSQLクエリ結果からレコードを取得

私は以下のように出力を持って、ルールがあるのは、テーブル名の一時

BUSINESS_KEY  STATUS_KEY CREATE_TIMESTAMP 
123    a1   1 P.M. 
123    a1   1:30 P.M. 
123    b1   2:00 P.M. 
123    a1   2:30 P.M. 

私は番目のレコードを破棄しなければならない上記

BUSINESS_KEY  STATUS_KEY CREATE_TIMESTAMP 
123    a1   1 P.M. 
123    b1   2:00 P.M. 
123    a1   2:30 P.M. 

のうち、記録の下にピックアップするとしましょう同じstatus_keyが連続したタイムスタンプの出力に1:00 PMよりも上の例のように出力された場合および1:30 P.M.には、最も古いタイムスタンプレコードのみが取得されます。最初のレコードと連続していないので、4番目のレコードを選択することができます。

私はすべてのrank()、row_number、self joinの組み合わせを試しましたが、動作しませんでした。誰でも助けてくれますか?

+0

私は同様の質問は[こちら](http://stackoverflow.com/questions/42142981/how-to-groupに答え'LAG'と' ROW_NUMBER() 'を使用して、このようなデータのような取り出しが可能な特定の行からなるグループ/ 42145336#42145336)を作成します。私はTIMESTAMPを 'DATETIME'として保存することをお勧めします。なぜなら、日々のデータを並べ替えることは頭痛を引き起こすからです。時間が11時50分、00時01分だったら? – scsimon

答えて

0

lag()を1つ使用し、row_number()を別の使用方法で使用します。後者は、これは簡単ですlag()で前のSQL Server 2012に適しています。

select t.* 
from (select t.*, 
      lag(status_key) over (partition by business_key order by create_timestamp) as prev_status_key 
     from t 
    ) t 
where prev_status_key is null or prev_status_key <> status_key; 
+0

このヒントは私のために働いた。ありがとう – Chaitanya

関連する問題