Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Cлияние строк в одну по условию / 16 сообщений из 16, страница 1 из 1
13.03.2020, 12:33
    #39937037
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Добрый день уважаемые форумчане.

Имею таблицу такого вида (приложил скрин).

В ней есть строки которые заканчиваются и начинаются на одинаковое время(строка 2, 3), т. е. перерыва в интервале времени не содержат, их нужно убрать, в данном случае нужно убрать третью строку. Возможно ли это сделать средствами SQL, если возможно, что нужно использовать?
...
Рейтинг: 0 / 0
13.03.2020, 14:57
    #39937130
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Дайте CREATE TABLE исходной таблицы, и пример данных в виде INSERT INTO. И укажите точную версию MySQL.

it_crb29
нужно убрать третью строку

Убрать - просто убрать из выборки, или удалить из таблицы?
Окончание для третьей строки надо переместить во вторую вместо нынешнего, чтобы получить слитный, суммарный, интервал, или вторую трогать не надо?
Окончание третьей равно началу четвёртой - четвёртую тоже надо убрать?
одинаковое время - с точностью до секунды? или возможна небольшая ошибка (плюс-минус). который следует игнорировать?
...
Рейтинг: 0 / 0
13.03.2020, 18:56
    #39937265
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
1. Просто убрать из выборки.
2.
2.1 Не трогаем вторую строку и не трогаем четвертую строку. ( Тогда начало интервала я возьму из 2ой, а конец из 4ой)
ИЛИ
2.2 Заменяем во второй строке дату окончания, на дату окончания в четвертой строке. (Тогда начало и конец я возьму из второй строки)
2.3 В обоих случаях 3я строка уйдет из выборки.
3. Время скорее всего будет точное, поэтому и погрешности не будет.

Версия mysql на данный момент 5.1.73, через неделю переделаю на 5.5.67;
Файлы приложил.

Ссылка на дамп
...
Рейтинг: 0 / 0
13.03.2020, 19:19
    #39937271
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Нет, Вы это серьёзно - структура аж с внешними ключами и комментариями, и пример данных на 12 метров?

В структуре следует убрать всё лишнее - все не-уникальные индексы и внешние ключи, а также ненужные для сути проблемы поля. Ну и, само собой, всякие атрибуты таблицы и прочее, для сути ненужное.
В примере данных - оставить 5-10-20 записей, на 2-3 клиента. Причём важное для сути проблемы сочетание должно встречаться и не встречаться у как минимум одной группы (в данном случае к одного - только пары, у другого цепочка, у третьего вообще без слияния).
Ну и, конечно. нужен требуемый (эталонный) результат. На именно этих данных.

it_crb29
Версия mysql на данный момент 5.1.73, через неделю переделаю на 5.5.67;
Хреново - и то, и другое. Им же сто лет в обед! почему не восьмёрка-то?
Это придётся решать на переменных - значит, индексы побоку, сплошной фуллскан.
...
Рейтинг: 0 / 0
13.03.2020, 20:13
    #39937289
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Прикладываю, файл с insert и разбор того что должно быть на выходе. Раскрасил цветами.

Если переходить на 8ку и использовать 8ку я замучаюсь дебажить возникшие перфоманс проблемы
...
Рейтинг: 0 / 0
13.03.2020, 22:22
    #39937319
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT person_id, `date`, MIN(begTime) begTime, MAX(endTime) endTime
FROM ( SELECT schedule.*,
              @group := CASE WHEN CONCAT(`date`, ' ', begTime) = @prev_datetime
                             THEN @group
                             ELSE @group + 1
                             END group_number,
              @prev_datetime := CONCAT(`date`, ' ', endTime) prev_datetime
       FROM schedule, (SELECT @group := 0, @prev_datetime := NULL) init_variable
       ORDER BY `date`, begTime ) subquery
GROUP BY group_number;


fiddle

PS. Предполагается, что время совпадает ТОЧНО, и нет наложения диапазонов. Иначе подзапрос нужно корректировать.

PPS. В следующий раз старайтесь предоставлять исходные данные в виде вот такого fiddle - это сильно упрощает процесс.
...
Рейтинг: 0 / 0
14.03.2020, 09:09
    #39937355
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Вы сделали в SQL, то, что я бы сделал только на js, я даже и не знал что SQL так умеет. К тому же очень, очень редко встретишь человека готового разобрать вопрос и дать исчерпывающий ответ. Запрос я изучу, доработаю, вам спасибо за разъяснения и поддержку!
...
Рейтинг: 0 / 0
14.03.2020, 13:06
    #39937389
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
it_crb29
Вы сделали в SQL, то, что я бы сделал только на js
На JS вы бы забили сеть трафиком (это ж сколько запросов!), и было бы на порядок медленнее.

it_crb29
даже и не знал что SQL так умеет.

FAQ: Нумерация строк и другие вопросы про использование переменных

it_crb29
Запрос я изучу

Для изучения выполните только подзапрос и поймите, что и как он считает для передачи основному запросу.
Не разберётесь - спрашивайте.
...
Рейтинг: 0 / 0
14.03.2020, 22:47
    #39937481
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Table

Если допустить, что в таблице Schedule будет несколько разных person_id, при этом сортировать по дате не нужно, SELECT будет по одному дню.

То на данной выборке, ошибка в 4 строке
Код: sql
1.
'927', '2020-03-13', '09:00:00', '11:00:00'



и не хватает строки
Код: plsql
1.
'928', '2020-03-13', '10:00:00', '11:00:00'



Необходимо конкатенировать только строки с одинаковым `person_id`.

П.С. Запрос я немного изменил. В строчке
Код: plsql
1.
ORDER BY `person_id`, `begTime` ) subquery

у меня на сервере сортирует и по person_id и по begTIme, на fiddle только по одному полю.
П.С.С. Сегодня уже поздно, завтра с утра я подумаю как делать конкатенацию только у строк с одинаковым person_id и отпишусь.
...
Рейтинг: 0 / 0
14.03.2020, 23:17
    #39937484
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
it_crb29
Необходимо конкатенировать только строки с одинаковым `person_id`.
Ну так откорректируйте fiddle, добавьте записей для ещё 1-2 персон... потребуется
Код: sql
1.
ORDER BY person_id, `date`, begTime
...
Рейтинг: 0 / 0
15.03.2020, 09:49
    #39937516
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Запрос я откорректировал и данных добавил.
fiddle

Если определить что select будет по одной дате, чего мне на данный момент достаточно, то следующий запрос делает все что нужно, я поменял в конкатенации поле `date` на `person_id`.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT person_id, `date`, MIN(begTime) begTime, MAX(endTime) endTime
FROM ( SELECT Schedule.person_id, Schedule.date, Schedule.begTime,Schedule.endTime,
              @group := CASE WHEN CONCAT(`person_id`, ' ', begTime) = @prev_datetime
                             THEN @group
                             ELSE @group + 1
                             END group_number,
              @prev_datetime := CONCAT(`person_id`, ' ', endTime) prev_datetime
       FROM Schedule, (SELECT @group := 0, @prev_datetime := NULL) init_variable
       WHERE Schedule.begTime != '00:00:00' and Schedule.date = '2020-03-13'
       ORDER BY `person_id`, `date`, begTime ) subquery
GROUP BY group_number;



Если же допустить, что выборка будет по интервалу дат, скажем неделя, то полагаю нужно будет сделать что то вроде:

Код: sql
1.
 CASE WHEN CONCAT(`person_id`, `date`, '  ', begTime) = @prev_datetime



Вечером проверю свое предположение на большой выборке.
Еще раз спасибо.
...
Рейтинг: 0 / 0
15.03.2020, 22:47
    #39937673
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Итоговый запрос такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 	`person_id`, `date`, MIN(`begTime`) begTime, MAX(`endTime`) endTime
FROM ( SELECT Schedule.person_id, Schedule.date, Schedule.begTime,Schedule.endTime,
              @group := CASE WHEN CONCAT(`person_id`, ' ', `date`,' ', begTime) = @prev_datetime
                             THEN @group
                             ELSE @group + 1
                             END group_number,
              @prev_datetime := CONCAT(`person_id`, ' ', `date`, ' ', endTime) prev_datetime
       FROM Schedule, (SELECT @group := 0, @prev_datetime := NULL) init_variable
       WHERE Schedule.begTime != '00:00:00' and Schedule.date BETWEEN '2020-03-12' AND '2020-03-13'
       ORDER BY `date`, `begTime` ) subquery
GROUP BY group_number;



Единственно не совсем понимаю почему ORDER BY `date` не сортирует как надо.
...
Рейтинг: 0 / 0
16.03.2020, 07:25
    #39937705
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
it_crb29
почему ORDER BY `date` не сортирует как надо.
Неправда. Он всё сортирует верно. Иначе бы расчёт с использованием переменных накосячил.

Просто нужно помнить, что во внешнем запросе сортировка, выполненная в подзапросе, не имеет никакого значения. Если надо - в нём должна быть ещё одна, своя, сортировка.
...
Рейтинг: 0 / 0
13.10.2020, 19:39
    #40008187
it_crb29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Все вспоминаю с чувством благодарности, помощь, которую вы мне оказали, с того времени дополнил и изменил запрос, но то что вы сделали, безусловно, великолепно.
...
Рейтинг: 0 / 0
14.10.2020, 11:15
    #40008370
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
Akina,

Разве в подзапросе не надо учитывать "доктора/поциента" (кто там Сухих?) для нумерации групп? Кмк, так получается одна сквозная нумерация, которую потом "фиг разделишь" по пациентам..

.. может group_number собирать как текст CONCAT(номер, пациент), не?
...
Рейтинг: 0 / 0
14.10.2020, 11:52
    #40008387
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cлияние строк в одну по условию
.. поторопился, ужо есть. :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Cлияние строк в одну по условию / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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