MySQL: Konvertieren von Zeilen in Spalten basierend auf Feldwerten

MySQL: Konvertieren von Zeilen in Spalten basierend auf Feldwerten

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

attr1und attr2jeder kann zwei mögliche Werte annehmen. attr1kann Werte annehmen vonAUndB. attr2kann Werte annehmen vonCUndDDiese beiden Felder haben also als Paar zusammen vier mögliche Werte:Klimaanlage,ANZEIGE,vor Christus,BD.

data1kann 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 data1auf 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.attr2data1

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 BDmit 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 RecCreatedFeld. 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 RecCreatedFeld.

Wie kann ich eine SQL-Abfrage schreiben, die dies erreicht?

verwandte Informationen