Die Kombination aufgeteilte Bereiche in einer SQL-Abfrage
Ich arbeite an einer Abfrage, die muss einige Daten mit Zeilen-Kombination auf Basis von Zeiträumen. Diese Zeilen sind doppelt, in der alle Daten, Werte, außer dem Datum Bereiche aufgeteilt sind. Zum Beispiel die Daten der Tabelle Aussehen kann
StudentID StartDate EndDate Field1 Field2
1 9/3/2007 10/20/2007 3 True
1 10/21/2007 6/12/2008 3 True
2 10/10/2007 3/20/2008 4 False
3 9/3/2007 11/3/2007 8 True
3 12/15/2007 6/12/2008 8 True
Das Ergebnis der Abfrage sollte die aufgeteilte Bereiche kombiniert. Sollte die Abfrage zu kombinieren, Datumsbereiche mit einem Abstand von nur einem Tag. Wenn es mehr als eine ein-Tages-Lücke, dann die Zeilen sollten nicht kombiniert werden. Die Zeilen, die nicht über eine aufgeteilte Reihe kommen sollte unverändert. Das Ergebnis würde wie folgt Aussehen
StudentID StartDate EndDate Field1 Field2
1 9/3/2007 6/12/2008 3 True
2 10/10/2007 3/20/2008 4 False
3 9/3/2007 11/3/2007 8 True
3 12/15/2007 6/12/2008 8 True
Was wäre die SELECT-Anweisung für diese Abfrage?
- Konnte Sie klären Sie die Anzahl der Bereiche pro Schüler? Und sind die Lücken wichtig?
- Ich habe korrigiert die Schreibfehler. Dank
- Was passiert, wenn es drei zusammenhängende Bereiche der Termine für ein Schüler?
- Was ist, wenn die
Field
oderField2
Werte Veränderungen zwischen den Zeilen, sonst müssen kombiniert werden? Was passiert dann? Diese Art von änderungen die Abfrage, nur ein bisschen. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code sollte funktionieren. Ich habe ein paar Annahmen wie folgt: es gibt keine überschneidungen der Zeiträume, es gibt keine NULL-Werte in einem der Felder, und das Anfangsdatum für eine bestimmte Zeile immer kleiner als das Enddatum. Wenn Ihre Daten nicht diesen Kriterien entsprechen, müssen Sie eine Anpassung dieser Methode, aber es sollte zeigen Sie in die richtige Richtung.
Können Sie Unterabfragen anstelle der Aussicht, aber das kann umständlich sein, so habe ich die Aussicht machen den code übersichtlicher.
In meiner Erfahrung, die ich habe zu kombinieren, die Bereiche im post-processing (nicht in SQL, sondern in meinem Skript). Ich bin nicht sicher, dass eine SQL kann dies tun, besonders weil man kann nie genau wissen, wie viele Zeiträume werden müssen, angekettet in einem bestimmten Fall. Wenn dies gemacht werden kann, aber ich würde gerne wissen, zu.
EDIT: Meine Antwort ist unter der Annahme, dass Sie mehr als eine Reihe von Termine pro student, nicht nur ein Anfang und ein Ende. Wenn Sie nur das eine Datum-Bereich ohne Lücken, dann die anderen genannten Lösungen sind der Weg zu gehen.
Wenn die min()/max () - Lösungen sind nicht gut genug (z.B. wenn Sie die Termine sind nicht zusammenhängend, und Sie möchten, um die Gruppe getrennte Datenbereiche separat), ich Frage mich, ob etwas mit Oracle zu STARTEN MIT und CONNECT BY-Klauseln funktionieren würde. Was natürlich nicht funktionieren würde in jeder Datenbank.
BEARBEITEN: Machen Sie einen anderen Satz von SQL für den Zugriff. Getestet habe ich Sie alle, aber Stück für Stück, weil ich nicht weiß, wie man mehrere Anweisungen zu einer Zeit, in der Zugang. Da ich auch nicht weiß, wie zu tun, Kommentare, sehen Sie die Kommentare in der SQL-version, unterhalb.
Ich denke, das ist es, Sie in der SQL Server - ich habe es nicht im Zugriff. Ich habe es noch nicht getestet für ausgefallene Bedingungen, wie mehrere überlappende Datensätze, etc., aber das sollte Ihnen den Einstieg. Es aktualisiert alle doppelten, kleine-Lücke records, verlassen extras in der Datenbank. MSDN hat eine Seite, die auf die Beseitigung der Duplikate: http://support.microsoft.com/kb/139444
Alternative Letzte Abfrage aus, um die von Tom H. in der akzeptierten Antwort ist
Dieser arbeitete auch an alle test-Daten.
Heres ein Beispiel mit Testdaten mit SQL Server 2005/2008-syntax.
Haben Sie als nicht-equi-join? Das würde in etwa so Aussehen:
Was, die gibt Ihnen ist, Sie alle Datensätze, die nicht über eine corresponing Datensatz beginnt mit dem Tag nach dem Enddatum des ersten Datensatzes.
[Warnung: beachten Sie, dass können Sie nur Bearbeiten, eine nicht-equi-join in der Access-Abfrage-designer in SQL-Ansicht -- wechseln Sie in die Entwurfsansicht konnte, dass die Verknüpfung verloren gehen (obwohl, wenn Sie switch-Zugriff, erzählt Sie über das problem, und wenn Sie sofort wieder zurück wechseln, um die SQL-Ansicht, die Sie nicht verlieren)]
Wenn Sie dann die UNION, dass mit dieser:
Sollte es Sie geben, was Sie brauchen, vorausgesetzt, es sind nie mehr als zwei zusammenhängende Datensätze gleichzeitig. Ich bin mir nicht sicher, wie Sie würde es tun, wenn Sie hatte mehr als zwei zusammenhängende Sätze (es könnte mit Blick auf StartDate-1 im Vergleich zu EndDate), aber dies könnte den Einstieg in die richtige Richtung.
Ergeben würde, dass Sie das Ergebnis vorausgesetzt, das war nicht eine Lücke zwischen den auf die Schüler, die im Zeitbereich.
Dies ist ein klassisches problem in SQL (die Sprache) z.B. abgedeckt Joe Celko 's Bücher" SQL for Smarties" (Kapitel 23, Regionen, Rennt, Lücken, Folgen und Reihen) und sein neuestes Buch "Denken in Gruppen" (Kapitel 15).
Während es 'Spaß' zu beheben, die Daten zur Laufzeit mit einem monster-query, für mich ist dies eine jener Situationen, die können besser behoben, off-line und prozedural (ich persönlich würde es tun, mit Formeln in einer Excel-Tabelle).
Wichtig ist die effektive Datenbank-constraints, um zu verhindern, dass die überlappenden Zeiträumen wiederholt. Wieder, schreiben sequenziert Einschränkungen in SQL ist ein Klassiker: siehe Snodgrass (http://www.cs.arizona.edu/people/rts/tdbbook.pdf). Hinweis für MS Access-Benutzer: Sie müssen die Verwendung von CHECK-Einschränkungen.