MySQL: conversión de filas en columnas según los valores de los campos

MySQL: conversión de filas en columnas según los valores de los campos

Estoy usando MySQL Workbench 8.0.

Dividiré mi pregunta en dos partes, ya que creo que la primera parte será sencilla (pero está un poco más allá de mi nivel actual de conocimiento de SQL), pero la segunda parte puede no ser tan sencilla.

PREGUNTA PARTE 1

Tengo los siguientes datos de origen:

Clave P atributo1 atributo2 datos1 datos2
0 A C 1 14
1 A C 2 dieciséis
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

attr1y attr2cada uno toma dos valores posibles. attr1puede tomar valores deAyB. attr2puede tomar valores deCyD. Entonces, estos dos campos tomados juntos como un par tienen cuatro valores posibles:C.A.,ANUNCIO,antes de Cristo,BD.

data1puede tomar N valores diferentes, aunque arriba solo se muestran tres para mantener el ejemplo simple. Cualquier solución ofrecida a mis preguntas a continuación no debe asumir que data1se limita a valores en el rango 1 - 3.

Como primer paso, me gustaría escribir una consulta que transforme filas en columnas, basada en los pares ( attr1, attr2)C.A.,ANUNCIO,antes de Cristo,BD, como sigue:

datos1 C.A. ANUNCIO antes de Cristo BD
1 14 91 31 1
2 dieciséis 9 3 111
3 44 71 38 30

Implícito en el planteamiento de este problema está que los valores de tupla ( attr1, attr2, data1) son únicos.

¿Cómo puedo escribir una consulta SQL que logre esto?

PREGUNTA PARTE 2

La parte más desafiante del problema al que me enfrento es que los valores de tupla ( ,, attr1) no son realmente únicos como se supuso en la parte 1 anterior.attr2data1

Aquí hay una representación más precisa de mis datos:

Clave P atributo1 atributo2 datos1 datos2 RecCreado
0 A C 1 14 2024-01-01 13:00:00
1 A C 2 dieciséis 2024-01-01 13:00:00
2 A C 3 44 2024-01-01 13:00:00
3 A D 1 91 2024-01-01 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 2024-03-21 09:57:20
13 A C 2 23 2024-03-21 09:57:20
14 A C 3 54 2024-03-21 09:57:21
15 A D 1 19 2024-03-21 09:57:21
dieciséis A D 2 18 2024-03-21 09:57:21
17 A D 3 33 2024-03-21 09:57:22
18 B C 1 87 2024-03-21 09:57:22
19 B C 2 19 2024-03-21 09:57:22
20 B C 3 9 2024-03-21 09:57:22
21 B D 1 10 2024-03-21 09:57:23
22 B D 2 83 2024-03-21 09:57:23
23 B D 3 13 2024-03-21 09:57:23

Como puede verse ahora, las tuplas ( attr1, attr2, data1) pueden aparecer más de una vez. En el caso anterior, cada tupla posible aparece dos veces (aunque no hay un límite fijo sobre cuántas veces puede aparecer dicha tupla).

Me gustaría que la consulta que estoy intentando desarrollar devuelva lo siguiente:

datos1 C.A. ANUNCIO antes de Cristo BD
1 14 91 31 1
2 dieciséis 9 3 111
3 44 71 38 30
1 66 19 87 10
2 23 18 19 83
3 54 33 9 13

El problema es saber qué valores de AC, AD, BCy BDdeben agruparse con un valor dado de data1. Por ejemplo, en lugar de las agrupaciones deseadas que se muestran arriba, data1se podrían haber seleccionado las siguientes agrupaciones (incorrectas) para = 1:

datos1 C.A. ANUNCIO antes de Cristo BD
1 14 19 31 10
1 66 91 87 1

Lo único que tengo para formar correctamente la agrupación es el RecCreatedcampo. Los valores que están "muy próximos" en el tiempo deben agruparse. Por supuesto, esto requiere definir "muy juntos". Para los propósitos de esta publicación, definamos un grupo como el conjunto de valores que están dentro3 minutosunos de otros según el RecCreatedcampo.

¿Cómo puedo escribir una consulta SQL que logre esto?

información relacionada