powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Cлияние строк в одну по условию
16 сообщений из 16, страница 1 из 1
Cлияние строк в одну по условию
    #39937037
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые форумчане.

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

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

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

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

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

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

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

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

Если переходить на 8ку и использовать 8ку я замучаюсь дебажить возникшие перфоманс проблемы
...
Рейтинг: 0 / 0
Cлияние строк в одну по условию
    #39937319
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Cлияние строк в одну по условию
    #39937355
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы сделали в SQL, то, что я бы сделал только на js, я даже и не знал что SQL так умеет. К тому же очень, очень редко встретишь человека готового разобрать вопрос и дать исчерпывающий ответ. Запрос я изучу, доработаю, вам спасибо за разъяснения и поддержку!
...
Рейтинг: 0 / 0
Cлияние строк в одну по условию
    #39937389
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
Вы сделали в SQL, то, что я бы сделал только на js
На JS вы бы забили сеть трафиком (это ж сколько запросов!), и было бы на порядок медленнее.

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

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

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

Для изучения выполните только подзапрос и поймите, что и как он считает для передачи основному запросу.
Не разберётесь - спрашивайте.
...
Рейтинг: 0 / 0
Cлияние строк в одну по условию
    #39937481
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Cлияние строк в одну по условию
    #39937484
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
Необходимо конкатенировать только строки с одинаковым `person_id`.
Ну так откорректируйте fiddle, добавьте записей для ещё 1-2 персон... потребуется
Код: sql
1.
ORDER BY person_id, `date`, begTime
...
Рейтинг: 0 / 0
Cлияние строк в одну по условию
    #39937516
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос я откорректировал и данных добавил.
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
Cлияние строк в одну по условию
    #39937673
it_crb29
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итоговый запрос такой:
Код: 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
Cлияние строк в одну по условию
    #39937705
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
it_crb29
почему ORDER BY `date` не сортирует как надо.
Неправда. Он всё сортирует верно. Иначе бы расчёт с использованием переменных накосячил.

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

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

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


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