2016-08-02 10 views
0

У меня есть таблица Item_X которая имеет первичные столбцы как Item_id,Country,Date_from. Другая колонка, не входящая в состав PK, составляет Date_To, TypeOfSale. Есть TypeOfSale как 1, 2, 3.Непрерывные записи, недостающие временные промежутки.

В течение определенного периода времени действителен только по типу продажи. Для Ex: - enter image description here

Дата От всегда Date_to + 1.

У меня есть некоторые записи в моей таблице, которые являются прерывистыми. Пример: - enter image description here

Запись с 1 февраля по 29 февраля отсутствует.

Я хочу найти все такие записи. Первую запись не следует учитывать, и последняя запись может иметь To_date как null.

+0

У вас есть столбец, который определяет _order_ этих записей продаж? –

+1

@ AJ- Являются интервалами, которые должны быть календарными месяцами, или это просто совпадение в вашем примере ввода? Если три месяца подряд отсутствуют, вам нужны три строки на выходе или один (показ, например, 1 октября 2015 года и 31 декабря 2015 года)? Кроме того, какова дата начала и окончания OVERALL? Или вам нужны только пробелы МЕЖДУ существующими строками, а также не перед первой строкой или после последнего? Являются ли столбцы даты символьными типами данных или фактическим типом даты? – mathguy

+0

Или ... подождите ... вы просите показать существующие строки в таблице, где есть пробелы? Что именно вам нужно, чтобы результат выглядел? – mathguy

ответ

1

Вот один метод:

select r.* 
from records r 
where not exists (select 1 from records r2 where r2.item_id = r.item_id and r2.date_from = r.date_to + 1) and 
     exists (select 1 from records r2 where r2.item_id = r.item_id and r2.date_from > r.date_to); 

Это возвращает первую запись перед очагом.

Другой метод использует lead() и lag():

select r.* 
from (select r.*, 
      lead(date_from) over (partition by item_id order by date_from) as next_date_from, 
      lag(date_to) over (partition by item_id order by date_from) as prev_date_to 
     from records r 
    ) r 
where (date_from <> prev_date_to + 1) or 
     (date_to <> next_date_from - 1); 

Это возвращает обе записи.

+0

Также должна быть проверка страны, первая запись не должна рассматриваться, и последняя запись может иметь значение null в To_date –

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