Angesichts der folgenden Daten:
id | user_id | started | closed | dead
-------------------------------------------------------------------------------------------
7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL
7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07
13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57
13192 | 259140 | 2015-03-17 10:12:17 | NULL | 2015-03-18 11:46:46
13194 | 259140 | 2015-03-17 10:12:53 | NULL | 2015-03-18 11:46:36
14020 | 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 | NULL
17124 | 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 | NULL
19690 | 238846 | 2015-05-15 13:17:31 | NULL | 2015-05-27 13:56:43
20038 | 242650 | 2015-05-19 15:38:17 | NULL | NULL
20040 | 242650 | 2015-05-19 15:39:58 | NULL | 2015-05-21 12:01:02
20302 | 242650 | 2015-05-21 13:09:06 | NULL | NULL
20304 | 242650 | 2015-05-21 13:09:54 | NULL | NULL
20306 | 242650 | 2015-05-21 13:10:19 | NULL | NULL
20308 | 242650 | 2015-05-21 13:12:20 | NULL | NULL
21202 | 238846 | 2015-05-29 16:47:29 | NULL | NULL
21204 | 238846 | 2015-05-29 16:47:56 | NULL | NULL
21208 | 238846 | 2015-05-29 17:05:15 | NULL | NULL
21210 | 238846 | 2015-05-29 17:05:55 | NULL | NULL
21918 | 242650 | 2015-06-04 17:04:29 | NULL | 2015-06-12 15:47:23
Ich muss einen Datensatz erstellen, der die folgenden Regeln erfüllt:
- Gruppen werden zuerst durch definiert,
user_id
daher sollten wir nur Datensätze derselben vergleichenuser_id
- Alle Datensätze, die mindestens innerhalb von 15 Tagen nach dem Start, dem Schließen oder dem Tod eines anderen Datensatzes gestartet wurden, sollten als Gruppe gezählt werden.
- Von jeder Gruppe sollte das Ende entweder als der erste geschlossene Datensatz berechnet werden oder alle Datensätze haben einen Wert für tot und wir nehmen das größte Datum der toten Spalte.
- Wenn ein Datensatz nicht innerhalb von 15 Tagen nach Beginn oder Ende einer anderen Gruppe gestartet wurde, beginnt eine neue Gruppierung.
Ich bin vorläufig der Meinung, dass meine Daten folgendermaßen aussehen sollten:
user_id | gestartet | Ende -------------------------------------------------- ---- 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 259140 | 2015-03-23 14:32:16 | 2015-03-24 15:57:32 242650 | 2015-04-16 16:19:08 | 2015-04-16 16:21:06 242650 | 2015-05-21 13:09:06 | NULL 238846 | 2015-05-15 13:17:31 | NULL
Kann jemand eine Anleitung zum Erstellen einer Abfrage geben, um diese Bedingungen zu erfüllen?
Hier ist ein Link zu den DDL- und DML-Anweisungen für die in dieser Frage dargestellten Daten.
Alternativ könnten wir die Regeln 2 und 4 überspringen und einfacher angeben, dass nur Datensätze enthalten sein sollten, die sich überlappen. Die wichtigere Regel ist, dass in einem bestimmten Satz, wenn es ein geschlossenes Datum gibt, dies das Ende des Satzes und nicht das größte Totdatum wird.
Antworten:
Aufgrund der Unklarheit der Frage habe ich vier verschiedene Lösungen gefunden. Die Lösungen unterscheiden sich in:
Bitte beachten Sie, dass dies in SQL Server und nicht in MySQL erfolgt. Abgesehen von einigen sehr geringfügigen Syntaxänderungen sollte es genauso funktionieren.
Gemeinsame Setup- und Beispieldaten für alle vier Methoden
1. CASCADING - VERWENDUNG DER CLOSED RECORD-Lösung
Dies ist die Lösung, nach der der Fragesteller meiner Meinung nach sucht und die zu seinen Ergebnissen passt.
2. NON-CASCADING - VERWENDUNG DER CLOSED RECORD-Lösung
Der Start wird nach dem ersten Abschlussdatum berechnet, sofern verfügbar, und dann nach dem frühesten Startdatum.
3. NON-CASCADING - VERWENDUNG DER FRÜHESTEN DATUM-Lösung
Start nur nach frühestem Datum berechnet.
4. CASCADING - VERWENDUNG DER FRÜHESTEN DATUM-Lösung
Start nur nach frühestem Datum berechnet.
quelle
Ich mache mir Sorgen, dass wir möglicherweise kein klares Bild davon haben, wie eine Gruppe definiert ist. Ich sage dies nur, weil die oben genannten Daten abhängig von einigen nicht angegebenen Bedingungen entweder eine riesige Einzelgruppe oder drei Gruppen bilden, in denen eine Gruppe die Menge dominiert.
Fehlende Gruppierungsbedingungen?
1) Kaskadiert diese 15-Tage-Regel? Wenn ein Datensatz
Y
10 Tage nach einem anderen Datensatz beginnt und 10 Tage danach einX
weiterer DatensatzZ
gestartet wird, bildet dieser dann eine Gruppe von drei DatensätzenX,Y,Z
oder zwei Gruppen mit jeweils zwei DatensätzenX,Y
undY,Z
? Ich ging davon aus, dass die 15-Tage-Regeln zu größeren Gruppen zusammenfallen.2) Sind die Daten inklusive? Wenn beispielsweise ein Datensatz viele Monate später ein Startdatum und dann ein Totdatum hat, werden dann alle Tage in diesem Bereich in der Gruppe zusammengeführt? Ich behandle beide Möglichkeiten in meiner kurzen Analyse unten.
Mögliche Gruppierungen
Wenn wir also mit id beginnen
7714
, sehen wir, dass das Startdatum 1/27 ist. Der nächste Eintrag7882
ab dem 28. Januar fällt eindeutig in diese Gruppe. Beachten Sie jedoch, dass dies7882
am 15. Mai endet. Daher muss alles, was innerhalb von 15 Tagen nach dem 15. Mai beginnt, zur Gruppe hinzugefügt werden.Somit wird
19690
durch21210
Hinzufügen zur Gruppe hinzugefügt, was durch Kaskadierung dazu führt,21918
dass anschließend zur Gruppe hinzugefügt wird. Die Kaskadierung hat fast alle Einträge im Satz verbraucht. Nennen Sie dasGROUP A
.Wenn die Gruppierung jedoch auch datumsbezogen ist
13190
,17124
müssen auch alle Einträge von bis bis zu gehörenGROUP A
, und jetzt befinden sich alle IDs in einer einzigen Gruppe.Wenn die Daten von
GROUP A
nicht inklusive sind, sich aber strikt an die Regel '15 Tage danach 'mit Kaskadierung halten, haben Sie stattdessen eine zweite Gruppe bestehend aus13190
durch14020
und eine dritte Gruppe mit einem einzigen Eintrag17124
.Meine Frage lautet im Wesentlichen: Entspricht eine dieser Angaben Ihrer beabsichtigten Gruppierung, oder fehlen in der Gruppendefinition andere Informationen? Es tut mir leid für eine so langwierige Antwort, aber es scheint nicht, dass Ihre vorläufig angeforderte Ausgabe Ihrer Gruppierungsdefinition entspricht.
Ich bin mir sicher, dass wir dieses Problem mit Klarstellungen lösen können.
quelle