
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 |
attr1
y attr2
cada uno toma dos valores posibles. attr1
puede tomar valores deAyB. attr2
puede tomar valores deCyD. Entonces, estos dos campos tomados juntos como un par tienen cuatro valores posibles:C.A.,ANUNCIO,antes de Cristo,BD.
data1
puede 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 data1
se 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.attr2
data1
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
, BC
y BD
deben agruparse con un valor dado de data1
. Por ejemplo, en lugar de las agrupaciones deseadas que se muestran arriba, data1
se 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 RecCreated
campo. 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 RecCreated
campo.
¿Cómo puedo escribir una consulta SQL que logre esto?