2017-05-28 4 views
-1

適切なSQL式の作成に問題があります。SQL JOIN - 2番目のテーブルからMAX DateTimeを取得し、前のMAXの後の最初のDateTimeを他の値のために取得します。

私はその後、私はそのチケットがVENDORステータス(最後のVENDORステータス)を最後に入力した時間(最大時間)であったものを取得する必要がある場所からテーブルSTATUSHISTORYを持つ列TICKETID

TICKETID  
1000 
1001 

とテーブルTICKETを持っており、 VENDORステータスを終了すると(VENDORステータスを終了すると、最初の次のINPROGステータスが表示されますが、VENDORステータスの後の最初のINPROGのみ、VENDORステータスの次のステータスは常にINPROGです)。また、IDのVENDORステータスがSTATUSHISOTRYに全く存在しないこともあります(その後はNULLを返す必要があります)。ただし、INPROGは常に存在します.VENDORステータスの前、後、および後になります。 STATUSHISTORYの例を次に示します。

ID TICKETID STATUS DATETIME 
1 1000  INPROG 01.01.2017 10:00 
2 1000  VENDOR 02.01.2017 10:00 
3 1000  INPROG 03.01.2017 10:00 
4 1000  VENDOR 04.01.2017 10:00 
5 1000  INPROG 05.01.2017 10:00 
6 1000  HOLD  06.01.2017 10:00 
7 1000  INPROG 07.01.2017 10:00 
8 1001  INPROG 02.02.2017 10:00 
9 1001  VENDOR 03.02.2017 10:00 
10 1001  INPROG 04.02.2017 10:00 
11 1001  VENDOR 05.02.2017 10:00 

のでTICKETテーブルからクエリを実行すると、テーブルSTATUSHISTORYでJOINをやった結果は次のようになります。

ID  VENDOR_ENTERED  VENDOR_EXITED 
1000 04.01.2017 10:00 05.01.2017 10:00 
1001 05.02.2017 10:00 null 

ID 1000のための最後のVENDORステータスが04.01.2017最初 INPROGであったので、そのIDのVENDORステータス後のステータスは05.01.2017であり、ID 1001の場合、最後のVENDORステータスは05.02.2017であり、そのINPROGステータスはまだ発生していませんでした。 VENDORが存在しなかった場合、結果では両方の列がnullになります。 私は本当にこのことに固執しています。異なるJOINを試していますが、進歩はありません。 私を助けることができれば、事前にありがとうございます。

答えて

1

これはウィンドウ関数で行うことができます。まず、チケットに「ベンダー」グループを割り当てます。これは、各レコードの前または前に「ベンダー」レコードの数を数える累積合計を使用して行うことができます。

次に、レコードを集約して「ベンダー」グループごとに1レコードを取得します。最新のレコードを取得するには行番号を使用します。 So:

with vg as (
     select ticket, 
      min(datetime) as vendor_entered, 
      min(case when status = 'INPROG' then datetime end) as vendor_exitied 
     from (select sh.*, 
        sum(case when status = 'VENDOR' then 1 else 0 end) over (partition by ticketid order by datetime) as grp 
      from statushistory sh 
      ) sh 
     group by ticket, grp 
    ) 
select vg.tiketid, vg.vendor_entered, vg.vendor_exited 
from (select vg.*, 
      row_number() over (partition by ticket order by vendor_entered desc) as seqnum 
     from vg 
    ) vg 
where seqnum = 1; 
+0

ありがとう – Dejan

0

あなたは、最高の時間を取得するために集約、その時よりも高い日付値のすべてに参加し、その後、再集計することができます

select a.TicketID, 
     a.VENDOR_ENTERED, 
     min(EXIT_TIME) as VENDOR_EXITED 
from (
      select TicketID, 
        max(DATETIME) as VENDOR_ENTERED 
      from StatusHistory 
      where Status = 'VENDOR' 
      group by TicketID 
     ) as a 
     left join 
     (
      select TicketID, 
        DATETIME as EXIT_TIME 
      from StatusHistory 
      where Status = 'INPROG' 
     ) as b 
     on a.TicketID = b.TicketID 
     and EXIT_TIME >= a.VENDOR_ENTERED 
group by a.TicketID, 
     a.VENDOR_ENTERED 

DB2がSQLfiddleではサポートされていませんが、標準のSQLの例hereが見つかります。

関連する問題