powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В чем смысл
4 сообщений из 4, страница 1 из 1
В чем смысл
    #40102502
D1N1J1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Я новичок в MySQL и хоть убей, но никак не пойму код задачи:
В реляционной БД есть таблица с последовательностью натуральных чисел. Необходимо написать SQL запрос, выбирающий данные о всех пропусках чисел в данной последовательности, в виде двух колонок: первая колонка – начало интервала с пропущенными числами, вторая колонка – конец интервала. Например,
Исходная таблица:
1
3
4
7
8
12
15
17

Результат выполнения запроса:
2, 2
5,6
9,11
13, 14
16, 16

Решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table c(id int);
insert into c(ID) values (1);
insert into c(ID) values (3);
insert into c(ID) values (4);
insert into c(ID) values (7);
insert into c(ID) values (12);
insert into c(ID) values (15);
insert into c(ID) values (17);
-- конкретно строки ниже непонятны
select t.id + 1, min(t1.id) - 1  from c t inner join c t1 on t1.id > t.id + 1
left join c t2 on t2.id > t.id and t2.id < t1.id
where t1.id is not null and t2.id is null
group by t.id



Заранее спасибо!!!

Модератор: Тема перенесена из форума "Работа".
...
Рейтинг: 0 / 0
В чем смысл
    #40102615
AndrewS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D1N1J1,

чуть упростил исходный запрос:
Код: sql
1.
2.
3.
4.
5.
6.
select t.id + 1 id1, t1.id - 1 id2
  from      c t
  join      c t1 on t1.id > t.id + 1
  left join c t2 on t2.id > t.id     and t2.id < t1.id
  where t2.id is null
  order by t.id, t1.id



попробуйте выполнять его по частям и анализировать, что меняется/добавляется/убирается в результатах

Код: sql
1.
2.
3.
4.
5.
-- все интервалы от текущего числа с разрывом более единицы:
select *
from c t 
join c t1 on t1.id > t.id + 1
order by t.id, t1.id




Код: sql
1.
2.
3.
4.
5.
6.
7.
select *
from c t 
join c t1 on t1.id > t.id + 1
left join c t2 on t2.id > t.id   -- добавить все возможные интервалы от текущего числа
    -- and t2.id < t1.id      -- оставить интервалы, где ЕСТЬ меньшее число слева (будет not null)
-- where t2.id is null -- оставить интервалы, где НЕТ меньшего числа слева (будет null из-за left join)
order by t.id, t1.id



и т.д.
...
Рейтинг: 0 / 0
В чем смысл
    #40103006
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrewS

чуть упростил исходный запрос:
Код: sql
1.
2.
3.
4.
5.
6.
select t.id + 1 id1, t1.id - 1 id2
  from      c t
  join      c t1 on t1.id > t.id + 1
  left join c t2 on t2.id > t.id     and t2.id < t1.id
  where t2.id is null
  order by t.id, t1.id



t1.id в order by явно лишнее.

Еще рабочий вариант без левого джойна и фильтра (по ручным тестам на этих данных получился самым быстрым из предлагаемых)
Код: sql
1.
2.
3.
4.
5.
6.
7.
select max(id1)+1, id2-1
from
  (select t1.id id1, min(t2.id) id2
  from c t1
  join c t2 on t2.id > t1.id + 1
  group by t1.id) tt
group by id2



Но наверняка есть более быстрое и красивое решение.
...
Рейтинг: 0 / 0
В чем смысл
    #40103041
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver
наверняка есть более быстрое и красивое решение.
Зависит от версии MySQL. Если восьмёрка - то да.

Это самая обычная "gaps and islands".
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В чем смысл
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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