簡體   English   中英

Oracle SQL-比較帶日期的多行

[英]Oracle SQL - Comparing Multiple Rows with Dates

我正在使用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  

我正在嘗試編寫一個查詢,以比較客戶的購買情況,以使輸出結果是特定客戶在彼此之間兩年內在兩個不同位置進行購買的每個實例。 在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彼此之間有2年之內的兩次購買,但由於它們位於同一位置而被丟棄。 CustID = 4的購買被保留,因為購買8和9在2年內且在不同的位置,而9和10在2年內且在不同的位置(盡管8和10在同一位置, (不在10年內)。

注意:“日期”列具有Oracle SQL“日期”數據類型。

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

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

這大量使用了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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM