Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разделение временной диаграммы на области / 8 сообщений из 8, страница 1 из 1
28.05.2018, 16:08
    #39651163
novikovma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Коллеги, всем добрый день.

Есть такая задача:
Существует таблица data, которая представляет собой временную диаграмму, а именно:
uid,I,datеtime
4,221,2018-05-03 15:57:30
5,221,2018-05-03 15:57:37
6,321,2018-05-03 15:57:40
7,521,2018-05-03 15:57:42
8,521,2018-05-03 15:57:46
9,521,2018-05-03 15:57:53
a,522,2018-05-03 15:57:57
b,523,2018-05-03 15:58:00
c,533,2018-05-03 15:58:05
d,531,2018-05-03 16:13:56
e,534,2018-05-03 16:14:55
f,521,2018-05-03 16:15:42
10,521,2018-05-03 17:57:46
11,521,2018-05-03 17:57:53
12,522,2018-05-03 17:57:57
13,523,2018-05-03 18:58:00
...
и т.д.

uid в базе записан как text, но по факту - это номер записи в шестандцатиричном формате

Данную временную диаграмму необходимо поделить на этапы (e1,e2,e3) по признаку I<400(e1);401<I<525(e2);I>525(e3)

То есть необходимо запросом получить список этапов с указанием начала и конца этапа:

тип этапа;uid записи начала этапа;время начала;uid записи конца этапа;время конца этапа;суммарное время этапа (например в секундах)
e1; 4; 2018-05-03 15:57:30; 6; 2018-05-03 15:57:40; 10
e2; 7; 2018-05-03 15:57:42; b; 2018-05-03 15:58:00; 18
e3; c; 2018-05-03 15:58:05; e; 2018-05-03 16:14:55; 1010
e1; f; 2018-05-03 16:15:42; 13; 2018-05-03 18:58:00; 9738

Это похоже на какой-то рекурсивный mysql запрос, как я понимаю...
Куда смотреть?
...
Рейтинг: 0 / 0
28.05.2018, 16:16
    #39651169
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
novikovmaДанную временную диаграмму необходимо поделить на этапы (e1,e2,e3) по признаку I<400(e1);401<I<525(e2);I>525(e3)Создайте для этих "этапов" таблицу (name - min - max). А дальше связь, тупой отбор по BETWEEN, группировка и MIN/MAX.
...
Рейтинг: 0 / 0
28.05.2018, 16:26
    #39651178
novikovma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Как-то не очень срастается.
Ну выбираю я все записи, которые соответствуют условию I<400.
Получаю результат
4,221,2018-05-03 15:57:30
5,221,2018-05-03 15:57:37
6,321,2018-05-03 15:57:40
f,221,2018-05-03 16:15:42
10,221,2018-05-03 17:57:46
11,221,2018-05-03 17:57:53
12,222,2018-05-03 17:57:57
13,223,2018-05-03 18:58:00

Выбраны все записи которые соответствуют данному этапу.

А как его разбить на два этапа?
с 4-й записи по 6-ю и с f по 13?
...
Рейтинг: 0 / 0
28.05.2018, 16:36
    #39651184
novikovma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Наверно вопрос сводится к таком:

Необходимо выделить крайние записи, между которыми нумерация uid идет последовательно. Видимо, единственное условие для выборки именно такое.

Кто-то навскидку скажет, куда смотреть?
...
Рейтинг: 0 / 0
28.05.2018, 17:00
    #39651209
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
mysql> CREATE TABLE data (uid VARCHAR(32), n INT, dt DATETIME);
Query OK, 0 rows affected (0.25 sec)

mysql> INSERT INTO data (uid, n, dt) VALUES
    -> ('4',221,'2018-05-03 15:57:30'),
    -> ('5',221,'2018-05-03 15:57:37'),
    -> ('6',321,'2018-05-03 15:57:40'),
    -> ('7',521,'2018-05-03 15:57:42'),
    -> ('8',521,'2018-05-03 15:57:46'),
    -> ('9',521,'2018-05-03 15:57:53'),
    -> ('a',522,'2018-05-03 15:57:57'),
    -> ('b',523,'2018-05-03 15:58:00'),
    -> ('c',533,'2018-05-03 15:58:05'),
    -> ('d',531,'2018-05-03 16:13:56'),
    -> ('e',534,'2018-05-03 16:14:55'),
    -> ('f',521,'2018-05-03 16:15:42'),
    -> ('10',521,'2018-05-03 17:57:46'),
    -> ('11',521,'2018-05-03 17:57:53'),
    -> ('12',522,'2018-05-03 17:57:57'),
    -> ('13',523,'2018-05-03 18:58:00');
Query OK, 16 rows affected (0.04 sec)
Records: 16  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE ranges(name VARCHAR(32), nFrom INT, nTill INT);
Query OK, 0 rows affected (0.21 sec)

mysql> INSERT INTO ranges(name,nFrom,nTill) VALUES
    -> ('e1',0,400),
    -> ('e2',401,524),
    -> ('e3',525,65535);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT r.name, MIN(d.uid), MIN(d.dt), MAX(d.uid), MAX(d.dt), UNIX_TIMESTAMP(MAX(d.dt))-UNIX_TIMESTAMP(MIN(d.dt)) delta
    -> FROM data d, ranges r
    -> WHERE d.n BETWEEN r.nFrom AND r.nTill
    -> GROUP BY r.name;
+------+------------+---------------------+------------+---------------------+-------+
| name | MIN(d.uid) | MIN(d.dt)           | MAX(d.uid) | MAX(d.dt)           | delta |
+------+------------+---------------------+------------+---------------------+-------+
| e1   | 4          | 2018-05-03 15:57:30 | 6          | 2018-05-03 15:57:40 |    10 |
| e2   | 10         | 2018-05-03 15:57:42 | f          | 2018-05-03 18:58:00 | 10818 |
| e3   | c          | 2018-05-03 15:58:05 | e          | 2018-05-03 16:14:55 |  1010 |
+------+------------+---------------------+------------+---------------------+-------+
3 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
28.05.2018, 17:10
    #39651228
novikovma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Круто!
Конечно, часть записей пропало, но в целом подход понятен.

Спасибо огромное!
...
Рейтинг: 0 / 0
28.05.2018, 17:14
    #39651236
novikovma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
Oh Wait.

В результате данного запроса всегда будет 3 результата.
Если этапы будут повторяться, то чуда не произойдет :-(

Например:

INSERT INTO data (uid, n, dt) VALUES
-> ('4',221,'2018-05-03 15:57:30'),
-> ('5',221,'2018-05-03 15:57:37'),
-> ('6',321,'2018-05-03 15:57:40'),
-> ('7',521,'2018-05-03 15:57:42'),
-> ('8',521,'2018-05-03 15:57:46'),
-> ('9',521,'2018-05-03 15:57:53'),
-> ('a',522,'2018-05-03 15:57:57'),
-> ('b',523,'2018-05-03 15:58:00'),
-> ('c',533,'2018-05-03 15:58:05'),
-> ('d',531,'2018-05-03 16:13:56'),
-> ('e',534,'2018-05-03 16:14:55'),
-> ('f',541,'2018-05-03 16:15:42'),
-> ('10',221,'2018-05-03 17:57:46'),
-> ('11',221,'2018-05-03 17:57:53'),
-> ('12',222,'2018-05-03 17:57:57'),
-> ('13',523,'2018-05-03 18:58:00');

Должно быть 4 строки:
E1 от записи 4 до 6
E2 от 6 до b
E3 от c до f
E1 от 10 до 13
...
Рейтинг: 0 / 0
28.05.2018, 21:12
    #39651361
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разделение временной диаграммы на области
novikovmaподход понятен.Собсно это и была демонстрация подхода - как нетрудно заметить, я даже не озаботился сведением результата с показанных Вами.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Разделение временной диаграммы на области / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]