MySQL: преобразование строк в столбцы на основе значений полей

MySQL: преобразование строк в столбцы на основе значений полей

Я использую MySQL Workbench 8.0.

Я разделю свой вопрос на две части, поскольку считаю, что первая часть будет простой (но немного выходит за рамки моего текущего уровня знаний SQL), а вот вторая часть может оказаться не такой простой.

ВОПРОС ЧАСТЬ 1

У меня есть следующие исходные данные:

ПКей аттр1 attr2 данные1 данные2
0 А С 1 14
1 А С 2 16
2 А С 3 44
3 А Д 1 91
4 А Д 2 9
5 А Д 3 71
6 Б С 1 31
7 Б С 2 3
8 Б С 3 38
9 Б Д 1 1
10 Б Д 2 111
11 Б Д 3 30

attr1и attr2каждый принимает два возможных значения. attr1может принимать значенияАиБ. attr2может принимать значенияСиД. Таким образом, эти два поля, взятые вместе как пара, имеют четыре возможных значения:АС,ОБЪЯВЛЕНИЕ,До нашей эры,БД.

data1может принимать N различных значений, хотя выше показаны только три, чтобы упростить пример. Любое решение, предложенное для моих вопросов ниже, не должно предполагать, что data1оно ограничено значениями в диапазоне 1 - 3.

В качестве первого шага я хотел бы написать запрос, который преобразует строки в столбцы на основе пар ( attr1, attr2)АС,ОБЪЯВЛЕНИЕ,До нашей эры,БД, следующее:

данные1 АС ОБЪЯВЛЕНИЕ До нашей эры БД
1 14 91 31 1
2 16 9 3 111
3 44 71 38 30

В этой постановке задачи подразумевается, что значения кортежа ( attr1, attr2, data1) уникальны.

Как мне написать SQL-запрос, который позволит это сделать?

ВОПРОС ЧАСТЬ 2

Более сложная часть проблемы, с которой я столкнулся, заключается в том, что значения кортежа ( attr1, attr2, data1) на самом деле не являются уникальными, как предполагалось в части 1 выше.

Вот более точное представление моих данных:

ПКей аттр1 attr2 данные1 данные2 RecCreated
0 А С 1 14 2024-01-01 13:00:00
1 А С 2 16 2024-01-01 13:00:00
2 А С 3 44 2024-01-01 13:00:00
3 А Д 1 91 2024-01-01 13:00:01
4 А Д 2 9 2024-01-01 13:00:02
5 А Д 3 71 2024-01-01 13:00:02
6 Б С 1 31 2024-01-01 13:00:02
7 Б С 2 3 2024-01-01 13:00:02
8 Б С 3 38 2024-01-01 13:00:02
9 Б Д 1 1 2024-01-01 13:00:03
10 Б Д 2 111 2024-01-01 13:00:03
11 Б Д 3 30 2024-01-01 13:00:03
12 А С 1 66 2024-03-21 09:57:20
13 А С 2 23 2024-03-21 09:57:20
14 А С 3 54 2024-03-21 09:57:21
15 А Д 1 19 2024-03-21 09:57:21
16 А Д 2 18 2024-03-21 09:57:21
17 А Д 3 33 2024-03-21 09:57:22
18 Б С 1 87 2024-03-21 09:57:22
19 Б С 2 19 2024-03-21 09:57:22
20 Б С 3 9 2024-03-21 09:57:22
21 Б Д 1 10 2024-03-21 09:57:23
22 Б Д 2 83 2024-03-21 09:57:23
23 Б Д 3 13 2024-03-21 09:57:23

Как теперь можно увидеть, кортежи ( attr1, attr2, data1) могут появляться более одного раза. В приведенном выше случае каждый возможный кортеж появляется дважды (хотя нет фиксированного предела того, сколько раз такой кортеж может появляться).

Мне бы хотелось, чтобы запрос, который я пытаюсь разработать, возвращал следующее:

данные1 АС ОБЪЯВЛЕНИЕ До нашей эры БД
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

Проблема заключается в том, чтобы знать, какие значения AC, AD, BC, и BDдолжны быть сгруппированы вместе с заданным значением data1. Например, вместо желаемых группировок, показанных выше, data1могли быть выбраны следующие (неправильные) группировки для = 1:

данные1 АС ОБЪЯВЛЕНИЕ До нашей эры БД
1 14 19 31 10
1 66 91 87 1

Единственное, на чем мне нужно правильно сформировать группировку, это RecCreatedполе. Значения, которые "близки друг к другу" во времени, должны быть сгруппированы вместе. Конечно, для этого требуется определить "близко друг к другу". Для целей этого поста давайте определим группу как набор значений, которые находятся в пределах3 минутыдруг друга в зависимости от RecCreatedобласти.

Как мне написать SQL-запрос, который позволит это сделать?

Связанный контент