2017-06-27 3 views
0

Ich habe zwei Anfragen Rückkehr folgende Daten:eine Zuordnung zwischen zwei Tabellen

1:

2017-02-27 10:54:30.000 
2017-02-27 10:55:30.000 
2017-02-27 10:59:30.000 
2017-02-27 11:02:30.000 

2:

2017-02-27 10:52:42.000 2017-02-27 10:55:00.000 
2017-02-27 10:55:05.000 2017-02-27 10:55:43.000 
2017-02-27 10:57:30.000 2017-02-27 11:00:12.000 
2017-02-27 11:01:55.000 2017-02-27 11:02:57.000 

man denke an die Zeilen in der zweiten Folge Legen Sie als Zeitintervalle die erste Spalte 'start' und die zweite Spalte 'end' an. Was ich brauche, ist eine Art von Mapping zu erstellen und herauszufinden, wie viele Zeilen aus dem zweiten Ergebnissatz keine "Übereinstimmung" in der ersten Menge hat. Was ich damit meine ...

Hier ist ein Beispiel: Schauen Sie sich die erste Zeile R1 der zweiten Tabelle an.

2017-02-27 10:52:42.000 2017-02-27 10:55:00.000 

Wenn es keine Zeile in der ersten Tabelle, so dass ihr Wert zwischen den Anfangs- und Endwerte wäre, dann würden wir die Reihe R1 zurück. Die Ausgabe sollte die Anzahl aller solcher Zeilen sein.

Danke für jede Hilfe!

Antwort

2

Ein Ansatz hier ist, links die Tabelle mit den Intervallen der ersten Tabelle beizutreten. Zählen Sie dann alle Datensätze aus der zweiten Tabelle, für die kein Zeitstempel aus der ersten Tabelle in ein Intervall fällt.

SELECT COUNT(*) 
FROM Result2 r2 
LEFT JOIN Result1 r1 
    ON r1.dt BETWEEN r2.interval1 AND r2.interval2 
WHERE r1.dt IS NULL 
+0

Wenn Sie Ihre Antwort mit der untenstehenden vergleichen, gibt es einen Leistungsunterschied? Vielen Dank! –

+0

Tough Call ... die andere Antwort könnte etwas schneller sein, aber beide sollten ziemlich schnell sein, wenn Sie Indizes für die Intervallspalten haben. –

+0

Wie würde sich das ändern, wenn ich wollte, dass die Zeilen von r1 nur einmal verwendet werden können? Mit anderen Worten, keinen Zeitstempel auf zwei Intervalle abbilden. Vielen Dank! –

1

Wenn es keine Zeile in der ersten Tabelle ist so, dass sein Wert zwischen Anfang und am Ende würde Werte

Diese hübschen direkt in SQL übersetzt werden kann:

select count(*) from Result2 r2 
where not exists (
    select * from Result1 r1 
    where r1.value between r2.start and r2.end 
) 
+0

Wenn Sie Ihre Antwort mit der obigen vergleichen, gibt es einen Leistungsunterschied? Vielen Dank! –

+0

kann ich nicht wirklich sagen - der SQL-Optimierer ist ziemlich schlau. Der beste Weg, um herauszufinden, ist durch Testen! Versuchen Sie, beide Versionen auf echten Daten auszuführen, und aktivieren Sie "Tatsächlichen Ausführungsplan einbeziehen", um zu sehen, was sie tun. – Blorgbeard

+0

Wie würde sich das ändern, wenn ich wollte, dass die Zeilen von r1 nur einmal verwendet werden können? Mit anderen Worten, keinen Zeitstempel auf zwei Intervalle abbilden. Vielen Dank! –

Verwandte Themen