2016-07-22 8 views
1
USE tempdb; 
GO 

IF OBJECT_ID('tempdb..#demo_data') IS NOT NULL 
BEGIN 
    DROP TABLE #demo_data; 
END; 

CREATE TABLE #demo_data 
(
    row_id   INT PRIMARY KEY, 
    product   VARCHAR(30) NOT NULL, 
    customer  VARCHAR(30) NOT NULL, 
    measure   VARCHAR(30) NOT NULL, 
    value   NUMERIC(6, 1) NOT NULL, 
    valid_from_day INT NOT NULL, 
    valid_to_day INT NOT NULL 
); 

INSERT INTO #demo_data (
    row_id, 
    product, 
    customer, 
    measure, 
    value, 
    valid_from_day, 
    valid_to_day 
) 
SELECT 1 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 1 value, 20130101 valid_from_day, 20130401 valid_to_day UNION ALL 
SELECT 2 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 1.5 value, 20130301 valid_from_day, 20131231 valid_to_day UNION ALL 
SELECT 3 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 2 value, 20130401 valid_from_day, 20150101 valid_to_day UNION ALL 
SELECT 4 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 5 value, 20130101 valid_from_day, 20130401 valid_to_day UNION ALL 
SELECT 5 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 6 value, 20130301 valid_from_day, 20140401 valid_to_day UNION ALL 
SELECT 6 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 7 value, 20131231 valid_from_day, 20150101 valid_to_day UNION ALL 
SELECT 7 row_id, 'Widgets' product, 'Asda' customer, 'Gross Sales Price' measure, 100 value, 00000000 valid_from_day, 99999999 valid_to_day UNION ALL 
SELECT 8 row_id, 'Widgets' product, 'Asda' customer, 'Gross Sales Price' measure, 200 value, 20131231 valid_from_day, 20150101 valid_to_day UNION ALL 
SELECT 9 row_id, 'Widgets' product, 'Asda' customer, 'Distribution Cost' measure, 2 value, 20130301 valid_from_day, 20131231 valid_to_day UNION ALL 
SELECT 10 row_id, 'Widgets' product, 'Asda' customer, 'Distribution Cost' measure, 3 value, 20140401 valid_from_day, 20150101 valid_to_day; 

SELECT 
    row_id, 
    product, 
    customer, 
    measure, 
    value, 
    valid_from_day, 
    valid_to_day 
FROM 
    #demo_data 
ORDER BY 1; 

schreibt SQL zu identifizieren, welche Paare von Reihen haben identische Produkte, Kunden und Maßnahmen, mit überlappenden Datumsbereichenvon SQL-Abfrage

- z.B. Zeilen 1 und 2 haben das gleiche Produkt/Kunde/Maß und die überlappenden Datumsbereiche.

Ich bin verwirrt, wie Sie in Tabelle tun Vergleich .. Ich habe eine Idee über Joins verwenden, aber es wäre inneren sein beitreten oder einfach nur normal beitreten

+0

Dies ist Oracle? Sieht aus wie SQL Server - können Sie klären/aktualisieren? – Nicarus

+0

Sein SQL-Server sorry über falsches Tag – user5843174

+0

Das erste, was Sie tun müssen, ist entweder speichern Sie diese Daten als Daten oder behandeln Sie das in Ihrer Auswahl. – scsimon

Antwort

0

Der Begriff Sie suchen, ist self join. Es funktioniert wie folgt:

select yourFields 
from yourTable t1 join yourTable t2 on t1.something = t2.something 
and t1.somethingElse <> t2.somethingElse 
+0

? Nur ein Tisch beteiligt, nicht sicher, was Sie hier vorschlagen. Gruppieren nach und Arbeiten sollte funktionieren, nein? – Twelfth

0

Funktioniert die folgende Abfrage für Sie? Es ist eine innere Verbindung, aber verbinden Sie sich selbst

select t1.*, t2.row_id, t2.valid_from_day, t2.valid_to_day 
from #demo_data t1 
inner join #demo_data t2 
on t1.product=t2.product and t1.customer = t2.customer and t1.measure = t2.measure 
and ( (t2.valid_from_day > t1.valid_from_day) and (t2.valid_from_day < t1.valid_to_day) 
     or (t2.valid_to_day > t1.valid_from_day) and (t2.valid_to_day < t1.valid_to_day) 
    ) 
+0

gültiger Tag 0-9999999 wird zurückgegeben. Dies sind jedoch keine echten Daten. – scsimon

+0

@scsimon, was meinst du "gültiger Tag 0-9999999 wird zurückgegeben"? – jyao

+0

In Ihrer Abfrage wird die Zeile mit valid_from_day = 0 und valid_to_day = 9999999 zurückgegeben. Das Problem ist, dass die Werte nicht im Datumsformat gespeichert werden. Daher sind dies keine realen Daten oder sogar logische Werte. Sie sollten vor der Verwendung als "überlappender Zeitrahmen" konvertiert werden. Zum Beispiel .... 'convert (datetime, convert (varchar (10), Fall wenn d.valid_from_day = 0 dann null else d.valid_from_day Ende), 104) valid_from_day ' – scsimon