2017-09-13 49 views
0

我有這些表加盟條件:通過日期時間

讓步

Shipment_id,標題,Creation_datetime

1, A, 2017-09-13 

只選擇最後一個記錄,每一讓步有一個以上的SCAN

SCANS

Shipment_ID, Event_code, TSS_creation_date  
1, 200, 2017-09-10  
1, 400, 2017-09-11  
1, 600, 2017-09-12  
1, 800, 2017-09-15  
1, 900, 2017-09-16 

在我最後的結果我想

結果(特許)

Shipment_ID,Title, Creation_datetime, LAST_SCAN_AT_CREATION_DATE 

1, A, 2017-09-13, 600 

在那裏我得到了event_code=600因爲這是最後一排有creation_date <= concession_creation_date

我有這個嘗試查詢,但實際上效率低下,而且速度太慢,導致無法獲得結果。你知道如何使用Join嗎?

WITH 

ShipmentAndScans AS (
    SELECT 
     conc.shipment_id, 
     (
      SELECT 
       scan.event_code 
      FROM SCANS_TABLE scan 
      WHERE 
        scan.shipment_id = conc.shipment_id 
       AND scan.TSS_CREATION_DATE <= conc.CREATION_DATETIME 
       AND ROWNUM <=1 

     ) AS LAST_SCAN_AT_CONCESSION_TIME   
    FROM CONCESSIONS conc   
) 
SELECT * 
FROM ShipmentAndScans 
WHERE LAST_SCAN_AT_CONCESSION_TIME IS NOT NULL 

回答

0

我相信你想要的以下內容:

select sc.* 
from (select c.*, s.event_code, s.TSS_CREATION_DATE, 
      row_number() over (partition by c.shipment_id order by s.tss_creation_date desc) as seqnum 
     from concessions c join 
      scan s 
      on s.shipment_id = c.shipment_id and 
       s.TSS_CREATION_DATE <= c.CREATION_DATETIME 
    ) cs 
where seqnum = 1; 

在您的版本中,CTE基本上是做一個LEFT JOIN(通過一個相關的子查詢)。然而,外部查詢將該邏輯重新轉換爲JOIN

+0

似乎有效。你知道我怎樣才能得到最後的紀錄(最近的)? – Leo

0

千萬的加入,使用ROW_NUMBER()

with CTE as 
(
select c1.*, s2.*, 
     row_number() over(partition by c1.shipment_id order by TSS_creation_date desc) as rn 
from Concessions 
inner join SCANS s2 
on s2.shipment_id = c1.shipment_id 
) 
select * 
from CTE 
where rn = 1