2013-08-23 11 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 возвращаются, потому что они находятся в разных местах в течение 2 лет друг от друга. CustID = 2 выбрасываются, потому что они не в течение 2 лет. CustID = 3 имеет две покупки в течение 2 лет друг от друга, но они выбрасываются из-за того, что они находятся в одном месте. И покупки CustID = 4 хранятся, потому что Покупки 8 и 9 находятся в пределах 2 лет и в разных местах, а 9 и 10 находятся в пределах 2 лет и в разных местах (я хочу, чтобы они были сохранены, несмотря на то, что 8 и 10 находились в одном месте и не в течение 10 лет).

Примечание: столбец «Дата» имеет тип данных «Дата» 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

Смежные вопросы