2017-01-28 5 views
2

よりも、私はこのように見える二つのテーブルがある場合、2つの行を比較しますSQL Serverの - マッチが、ピック行X

event_ap 

Event a_nr tnr date   timestamp knr maschnr 
PAN  123  2203 2017-01-23 21600  11 x222 
PAN  132  2203 2017-01-22 21600  22 x222 
PAB  123  2203 2017-01-23 28523  11 x222 
PAN  555  2203 2017-01-23 14023  33 x222 
PAN  555  2201 2017-01-23 21235  44 x222 
PAB  222  2202 2017-01-23 21245  44 x222 
PAN  666  2202 2017-01-28 35000  44 x222 
PAB  666  2202 2017-01-28 35000  44 x222 

pers_stm 

name knr 
Test1 11 
Test2 22 
Test3 33 
Test4 44 

は、だから私は必要なものを、各ID(KNR)のための最後のレコードです。このための私のクエリはこのようになります

select * 
From ( 
     select * 
     from (select * 
        , row_number() over (partition by knr 
             order by date desc, timestamp desc) as RN 
      from event_ap 
      ) X 
     where RN = 1 
    ) Y 
join pers_stm p on p.knr = Y.knr 

しかし、これに問題があります。

あなたは表「event_ap」(最後の二つのレコード)の例では(同じタイムスタンプを含む)まったく同じデータを持つレコードがある以上見ることができるように唯一違いEvent-ですタグ

だから私は必要なもの、これまで私が持っているクエリに基づいて:

  • を(テーブルevent_ap(日付、タイムスタンプ)の最後のレコードは、既に上記のクエリを達成します)
  • 同じ日付、タイムスタンプおよびID(knr)を持つ2つのレコードがある場合は、イベントタグ「PAN」を持つレコードクエリ結果として

ありがとうございました!

答えて

0

てみますので、次のようになります。

select * 
From ( 
     select * 
     from (select * 
       , row_number() over (partition by knr 
            order by date desc, timestamp desc, Event desc) as RN 
      from event_ap 
      ) X 
     where RN = 1 
    ) Y 
join pers_stm p on p.knr = Y.knr 

これは、あなただけの「PAB」と、あなたのイベント欄に「PAN」を持っていることを前提としません。あなたは降順テキストの「PAN」の前だろうそこに何かを持っている場合、ソート後、ティムの答えは移動するための方法です。

+0

まあ、ありがとう:D予想より簡単に –

0

datetimestampによって最初の発注後の行番号のパーティションへ次case式を追加します:

case when Event = 'PAN' then 0 else 1 end 

これがトップにPANイベント・レコードを強制的に二つ以上のレコードが同じ日付を持つ必要があります/タイムスタンプ。日付/タイムスタンプのためのタイが存在しない場合には、このcase発現は影響を及ぼさないであろう、そしてそこタイであるがないPANレコードが存在しない場合には、それにも影響を及ぼさないであろう。あなたのover (...)order by句にEvent descを追加

select * 
From 
(
    select * 
    from 
    (
     select *, 
       row_number() over 
       (partition by knr order by date desc, 
              timestamp desc, 
       case when Event = 'PAN' then 0 else 1 end) as RN 
     from event_ap 
    ) X 
    where RN = 1 
) Y 
join pers_stm p 
    on p.knr = Y.knr