2013-08-23 71 views
1

我正在使用Oracle SQL。假設我有一個列出以下內容的表格。Oracle SQL - 比較多行與日期

PurchaseID CustID  Location  Date 
    1   1   A  8/23/2013 12:00:00 AM 
    2   1   B  8/15/2013 12:00:00 AM 
    3   2   A  5/15/2013 12:00:00 AM 
    4   2   B  1/01/2005 12:00:00 AM 
    5   3   A  1/15/2001 12:00:00 AM 
    6   3   A  1/30/2001 12:00:00 AM 
    7   3   B  8/23/2013 12:00:00 AM 
    8   4   A  5/05/2012 12:00:00 AM 
    9   4   B  8/15/2010 12:00:00 AM 
    10   4   A  9/20/2008 12:00:00 AM 

我想,這樣的輸出是每一個地方一個特定的客戶,使2年之內彼此在兩個不同的地點購買實例編寫按客戶的購買比較查詢。特別是在CustID = 3和CustID = 4類型的情況下,特別是在位置/日期難以組合的情況下。查詢的輸出應該如下所示。

PurchaseID CustID  Location  Date 
    1   1   A  8/23/2013 12:00:00 AM 
    2   1   B  8/15/2013 12:00:00 AM 
    8   4   A  5/05/2012 12:00:00 AM 
    9   4   B  8/15/2010 12:00:00 AM 
    10   4   A  9/20/2008 12:00:00 AM 

在輸出中,CustID = 1的購買被返回,因爲它們在兩年內彼此不同的位置。 CustID = 2被拋出,因爲它們不在2年內。 CustID = 3在兩年內有兩次購買,但因爲它們位於同一位置而被拋出。並且CustID = 4的購買被保留,因爲購買8和9在兩年內並且在不同位置,並且9和10在兩年內並且在不同位置(我希望儘管8和10位於同一位置,不在10年內)。

注意:Date列具有Oracle SQL'Date'數據類型。

一如既往,任何幫助/指導將不勝感激。

回答

2

您可以將搜索範圍限制爲下一個或上一個位置與當前位置不同的情況。然後查看時間差來選擇行。

這使得大量使用lag()lead()

select t.PruchaseId, t.CustId, t.Location, t.Date 
from (select t.*, 
      lag(location) over (partition by CustId order by Date) as prevloc, 
      lead(location) over (partition by CustId order by Date) as nextloc, 
      lag(date) over (partition by CustId order by Date) as prevdate, 
      lead(date) over (partition by CustId order by Date) as nextdate 
     from t 
    ) t 
where ((prevloc <> location) and (add_months(prevdate, 2*12) > date)) or 
     ((nextloc <> location) and (add_months(date, 2*12) > nextdate)); 
+0

感謝,偉大工程! – user1895076