
Я использую 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-запрос, который позволит это сделать?