Verknüpfen von Tabellen basierend auf einem datetime -, aber die datetime-Wert kann variieren, innerhalb von 5 Minuten
Arbeite ich mit einigen eher schlecht gestaltete Tabellen hier, und die änderung der Struktur ist mehr oder weniger aus der Frage. Also mit dieser sagte, hier ist meine Frage.
Muss ich join TableB.Datum auf TableA.Date, mit einer Marge von etwa 5 Minuten. In anderen Worten, kann die Verknüpfung nicht darauf verlassen, eine perfekte übereinstimmung.
Also, wenn das Datum in Tabelle a ist 2011-12-01 10:00:00.000
beitreten würde mit einem Datensatz in Tabelle B, wo das Datum, 2011-12-01 10:03:00.000
oder 2011-12-01 09:59:00.000
oder 2011-12-01 10:04:35.000
Kam ich mit einem kleinen trick ein Spielraum der Differenz von etwa 1 minute, indem er den als smalldatetime datetime, die Tropfen die Sekunde und die Millisekunde aus der datetime-Wert. Es funktioniert ganz gut, aber ich brauche eine größere Marge als das.
LEFT JOIN TableB ON CAST(TableA.SomeDate AS smalldatetime) = CAST(TableB.SomeDate AS smalldatetime)
Die Datum-Spalte in Tabelle B ist die einzige Verbindung zwischen den Daten in den beiden Tabellen, so kann ich nicht die Ergebnisse filtern, innerhalb der WHERE-Klausel. Ich weiß, dies kann potenziell zu produzieren einige ungenaue Ergebnisse, sondern weil, wie und Wann die Daten gespeichert sind, ich sollte nicht laufen in irgendwelche Probleme.
Irgendwelche Vorschläge?
- Abschneiden von casting zu smalldatetime ist nicht sogar nahe, das zu tun, was Sie wollen. Zeiten, die sich von einer Millisekunde, sondern lassen sich in verschiedenen Minuten, nicht übereinstimmt. Können Sie Tabellen hinzufügen, um die vorhandene Datenbank, z.B. eine Tabelle erstellen, die das Datum/Uhrzeit aus einer vorhandenen Tabelle erweitert, in 5 Minuten reicht und indiziert?
- Das problem mit diesem ist, dass Sie haben, um zu definieren, die 5-Minuten-Marge mehr starr. Was ist, wenn 2 Ergebnisse für tableA sind innerhalb von 5 Minuten von einander? Haben Sie beide sich in den gleichen Datensatz auf tableB? Sie erhalten dann doppelte Datensätze. Was möchten Sie vielleicht zu tun ist, bin Ihr datetimes in 5-Minuten-Eimer, aber diese Starrheit möglicherweise nicht für den Zweck. Wenn das, was Sie wirklich versuchen zu tun, ist eine fuzzy-Daten-Analyse dann vielleicht SQL ist die falsche Wahl der Sprache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen DATEDIFF Aussehen für weniger als 300 Sekunden (Minuten-Grenze beträgt null Sekunden, die geben falsche Ergebnisse). Für mehr Genauigkeit es egal, Verwendung Millisekunden < 300000
Das problem mit diesem ist, dass Sie haben, um zu definieren, die 5-Minuten-Marge mehr starr für SQL gut zu funktionieren. Wenn Sie möchten, werden unschärfer, dann SQL ist die falsche Sprache.
Was ist, wenn 2 Ergebnisse für tableA sind innerhalb von 5 Minuten von einander? Haben Sie beide sich in den gleichen Datensatz auf tableB? Sie erhalten dann doppelte Datensätze.
Was Sie tun möchten, ist bin Ihre datetimes in 5-Minuten-Eimer (oder was auch immer Sie wählen) mit einem Runden down/up-plan. Ein pre-made-lookup-Tabelle ist immer eine schnelle Performance-Lösung, die Tabelle enthält eine index-Spalte in jeder minute an jedem Tag und in einer weiteren Spalte mit den vereinbarten 5 Minuten Eimern. Diese Zwischentabelle könnte verwendet werden, um join-Tabelle a zu Tabelle B.
d.h. Die LookupTable (entschuldigt die Formatierung!)
LookupTime __________ BucketTime
2013-01-01 14:56 _____ 2013-01-01 14:55
2013-01-01 14:57_____ 2013-01-01 14:55
2013-01-01 14:58_____ 2013-01-01 15:00
2013-01-01 14:59_____ 2013-01-01 15:00
Würden Sie join der Tabelle a ein Datum, um die LookupTime oben.
Sie würde eine separate Verknüpfung, um eine zweite Kopie der LookupTime Tabelle für Tabelle B,
Dann verbinden sich die zwei Kopien der lookup-Tabelle auf jedem anderen auf der BucketTime Feld.
Der schwierige Teil ist die Vereinbarung, auf die Rundung, die Sie benutzen. Ich empfehle "Runde Auch" das glättet die Rundung bis bias, das kommt mit der Rundung Ziffern 1-4 nach unten und 5-9 bis.
Join-formatierten Datumsangaben. Formatieren Sie Sie so, dass Sie entweder Runde auf die nächsten 5 Minuten oder rund um die relevanten Zeitspanne. Es wird wahrscheinlich erfordern eine Benutzer-definierte Funktion.