2016-08-02 19 views
0

Ich habe eine Tabelle Item_X, die primäre Spalten wie Item_id,Country,Date_from hat. Andere Spalte nicht Teil von PK sind Date_To, TypeOfSale. Dort gibt es TypeOfSale als 1, 2, 3.Diskontinuierliche Aufzeichnungen, fehlende Zeitlücken.

Für einen bestimmten Zeitraum ist nur auf die Art des Verkaufs gültig. Für Ex: - enter image description here

Datum Ab immer DATE_TO + 1.

Ich habe einige Aufzeichnungen in meinem Tisch, die diskontinuierlich sind ist. Beispiel: - enter image description here

Datensatz vom 1. Februar bis 29. Feb fehlt.

Ich möchte alle solche Datensätze herausfinden. Der erste Datensatz sollte nicht berücksichtigt werden und der letzte Datensatz kann To_date als null haben.

+0

Haben Sie eine Spalte, die einen _Order_ dieser Verkaufsdatensätze festlegt? –

+1

@ AJ- Sind die Intervalle Kalendermonate, oder ist das nur ein Zufall in Ihrer Beispieleingabe? Wenn drei aufeinanderfolgende Monate fehlen, benötigen Sie drei Zeilen in der Ausgabe oder nur eine (z. B. 1. Oktober 2015 und 31. Dezember 2015)? Was ist der Anfangs- und das Enddatum? Oder brauchen Sie nur die Lücken ZWISCHEN bestehenden Reihen, und nicht auch vor der ersten Reihe oder nach der letzten? Sind die Datumsspalten im Datentyp "Character" oder im Datentyp "date date"? – mathguy

+0

Oder ... warte ... Willst du die vorhandenen Zeilen in deiner Tabelle anzeigen, wo Lücken sind? Wie genau soll die Ausgabe aussehen? – mathguy

Antwort

1

Hier ist eine Methode:

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); 

Dies gibt den ersten Datensatz vor der Lücke.

Ein anderes Verfahren verwendet lead() und 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); 

Diese beiden Datensätze zurückgibt.

+0

Es sollte auch eine Prüfung für das Land durchgeführt werden, der erste Datensatz sollte nicht berücksichtigt werden und der letzte Datensatz darf in To_date null sein –