
Ich verwende MySQL Workbench 8.0.
Ich werde meine Frage in zwei Teile aufteilen, da ich glaube, dass der erste Teil unkompliziert ist (aber etwas über meine derzeitigen SQL-Kenntnisse hinausgeht), der zweite Teil jedoch möglicherweise nicht so unkompliziert ist.
FRAGE TEIL 1
Ich habe folgende Quelldaten:
PSchlüssel | attr1 | attr2 | Daten1 | Daten2 |
---|---|---|---|---|
0 | A | C | 1 | 14 |
1 | A | C | 2 | 16 |
2 | A | C | 3 | 44 |
3 | A | D | 1 | 91 |
4 | A | D | 2 | 9 |
5 | A | D | 3 | 71 |
6 | B | C | 1 | 31 |
7 | B | C | 2 | 3 |
8 | B | C | 3 | 38 |
9 | B | D | 1 | 1 |
10 | B | D | 2 | 111 |
11 | B | D | 3 | 30 |
attr1
und attr2
jeder kann zwei mögliche Werte annehmen. attr1
kann Werte annehmen vonAUndB. attr2
kann Werte annehmen vonCUndDDiese beiden Felder haben also als Paar zusammen vier mögliche Werte:Klimaanlage,ANZEIGE,vor Christus,BD.
data1
kann N verschiedene Werte annehmen, obwohl oben nur drei gezeigt werden, um das Beispiel einfach zu halten. Bei jeder Lösung, die zu meinen Fragen unten angeboten wird, sollte nicht davon ausgegangen werden, dass sie data1
auf Werte im Bereich 1 - 3 beschränkt ist.
Als ersten Schritt möchte ich eine Abfrage schreiben, die Zeilen in Spalten umwandelt, basierend auf den ( attr1
, attr2
)-PaarenKlimaanlage,ANZEIGE,vor Christus,BD, wie folgt:
Daten1 | Klimaanlage | ANZEIGE | vor Christus | BD |
---|---|---|---|---|
1 | 14 | 91 | 31 | 1 |
2 | 16 | 9 | 3 | 111 |
3 | 44 | 71 | 38 | 30 |
Diese Problemstellung impliziert, dass die Tupelwerte ( attr1
, attr2
, data1
) eindeutig sind.
Wie kann ich eine SQL-Abfrage schreiben, die dies erreicht?
FRAGE TEIL 2
Der schwierigere Teil des Problems, mit dem ich konfrontiert bin , besteht darin, dass die Tupelwerte ( attr1
,, ) nicht wirklich eindeutig sind, wie in Teil 1 oben angenommen wurde.attr2
data1
Hier ist eine genauere Darstellung meiner Daten:
PSchlüssel | attr1 | attr2 | Daten1 | Daten2 | Erstellt mit |
---|---|---|---|---|---|
0 | A | C | 1 | 14 | 01.01.2024 13:00:00 |
1 | A | C | 2 | 16 | 01.01.2024 13:00:00 |
2 | A | C | 3 | 44 | 01.01.2024 13:00:00 |
3 | A | D | 1 | 91 | 01.01.2024 13:00:01 |
4 | A | D | 2 | 9 | 2024-01-01 13:00:02 |
5 | A | D | 3 | 71 | 2024-01-01 13:00:02 |
6 | B | C | 1 | 31 | 2024-01-01 13:00:02 |
7 | B | C | 2 | 3 | 2024-01-01 13:00:02 |
8 | B | C | 3 | 38 | 2024-01-01 13:00:02 |
9 | B | D | 1 | 1 | 2024-01-01 13:00:03 |
10 | B | D | 2 | 111 | 2024-01-01 13:00:03 |
11 | B | D | 3 | 30 | 2024-01-01 13:00:03 |
12 | A | C | 1 | 66 | 21.03.2024 09:57:20 Uhr |
13 | A | C | 2 | 23 | 21.03.2024 09:57:20 Uhr |
14 | A | C | 3 | 54 | 21.03.2024 09:57:21 Uhr |
15 | A | D | 1 | 19 | 21.03.2024 09:57:21 Uhr |
16 | A | D | 2 | 18 | 21.03.2024 09:57:21 Uhr |
17 | A | D | 3 | 33 | 21.03.2024 09:57:22 Uhr |
18 | B | C | 1 | 87 | 21.03.2024 09:57:22 Uhr |
19 | B | C | 2 | 19 | 21.03.2024 09:57:22 Uhr |
20 | B | C | 3 | 9 | 21.03.2024 09:57:22 Uhr |
21 | B | D | 1 | 10 | 21.03.2024 09:57:23 Uhr |
22 | B | D | 2 | 83 | 21.03.2024 09:57:23 Uhr |
23 | B | D | 3 | 13 | 21.03.2024 09:57:23 Uhr |
Wie man nun sehen kann, können die Tupel ( attr1
, attr2
, data1
) mehr als einmal vorkommen. Im obigen Fall kommt jedes mögliche Tupel zweimal vor (es gibt jedoch keine feste Grenze dafür, wie oft ein solches Tupel vorkommen kann).
Ich möchte, dass die Abfrage, die ich zu entwickeln versuche, Folgendes zurückgibt:
Daten1 | Klimaanlage | ANZEIGE | vor Christus | BD |
---|---|---|---|---|
1 | 14 | 91 | 31 | 1 |
2 | 16 | 9 | 3 | 111 |
3 | 44 | 71 | 38 | 30 |
1 | 66 | 19 | 87 | 10 |
2 | 23 | 18 | 19 | 83 |
3 | 54 | 33 | 9 | 13 |
Das Problem besteht darin, zu wissen, welche Werte von AC
, AD
, BC
, und BD
mit einem bestimmten Wert von gruppiert werden sollen data1
. Anstelle der oben gezeigten gewünschten Gruppierungen hätten beispielsweise die folgenden (falschen) Gruppierungen für data1
= 1 ausgewählt werden können:
Daten1 | Klimaanlage | ANZEIGE | vor Christus | BD |
---|---|---|---|---|
1 | 14 | 19 | 31 | 10 |
1 | 66 | 91 | 87 | 1 |
Das einzige, worauf ich die Gruppierung richtig aufbauen muss, ist das RecCreated
Feld. Werte, die zeitlich „nahe beieinander“ liegen, sollten gruppiert werden. Dazu muss man natürlich „nahe beieinander“ definieren. Für die Zwecke dieses Beitrags definieren wir eine Gruppe als die Menge der Werte, die innerhalb3 Minutenvoneinander, basierend auf dem RecCreated
Feld.
Wie kann ich eine SQL-Abfrage schreiben, die dies erreicht?