Интересная задачка для решения на SQL (Найти в диапазоне номеров пропуск) #290460


#0 by VVi3ard
Есть отсортированый набор номеров: 1,2,3,4,7,8,12,14,15 и.т.д. Нужно с помощью запроса найти "дырки" в этом наборе. т.е. 5,6,9,10,11,13. Не обязательно все сразу, достаточно если будет выодится первая попавшаяся "дырка".
#1 by VVi3ard
Пока эта задачка решается перебором в цикле но имхо это не красиво а вот как красиво я не могу придумать и мне эта недодуманая мысль покоя не дает :(
#2 by Feofan
Смотреть на разность между двумя соседними элементами. Если больше 1 то дырка.
#3 by AversDik2
Соединить с полным набором номеров и выявить дырки.
#4 by VVi3ard
ну это понятно, вот тольо как запросом получить "Предыдущую" строку?.
#5 by VVi3ard
2AversDik2 - Красиво :) Только возникает вопрос где взять полный набор номеров... например диапазон от 1 до 9999999999. Но в любом случае решение красивое :)
#6 by КонецЦикла
См. КМК
#7 by КонецЦикла
Это типо программист спрашивает "где взять"? %)
#8 by VVi3ard
2КонецЦикла Я например не знаю способа получить SQL запросом диапазон чисел. Сталкивался с похожей проблемой для дат там частично помогала конструкция "Периодами" в 8.1 при запуске системы можно формировать виртуальную таблицу и потом ей пользоватья но у меня к сожалению пока 8.0
#10 by AversDik2
"Выбрать 1, 2, 3, ... до максимального значения".
#11 by VVi3ard
2AversDik2 для 9999999999 мне больше понравился совет evd правда решение нельзя назвать тривиальным но рмботает классно. Спасибо :)
#12 by Vbif
Из НАБОР ГДЕ НомерИзНабора + 1 Не В (Набор)
#13 by ДрДрТартл
а если дырки будут длиннее чем 1?? Вы уверены что сработает
#14 by Vbif
пока Вы не указали - был уверен, а теперь я знаю что нет
#15 by masky
select select count(N2.id) - N1.id from t as N1, t as N2 where N2.id <= N1.id group by N1.id ) as N(i,gp) group by gp order by low,high
#16 by masky
select m, min(n) nMin, max(n) nMax from (select m, n, n-(select count(distinct n) from t tt where tt.m=t.m and tt.n<t.n) e from t) z group by m, e
#17 by masky
select  t1.id as mn,  t2.id as mx from t t1, t t2 where  not exists (select tt1.id from t tt1 where tt1.id = t1.id - 1) and  not exists (select tt2.id from t tt2 where tt2.id = t2.id + 1) and  t2.id - t1.id in (select count(*) - 1 from t where t.id between t1.id and t2.id) order by t1.id, t2.id
#18 by masky
ламеры.. кругом сплашные ламеры..
#19 by Vbif
это что за клон языка SQL в 915)? особенно интересует конструкция "as N(i,gp) "
#20 by masky
о хосподи. T-SQL это
#21 by Vbif
а на 1С-SQL, чтобы под 1С работало?
#22 by Vbif
ты запросы то проверял? в запросе 16 конструкция "select count(distinct n) from t tt where tt.m=t.m and tt.n<t.n" отматерит по полной, пиши уж корректно, неламо
#23 by ДрДрТартл
, а если id будет с пропусками - т.е. 1,2,7,9?? боюсь опять таки не сработает
#24 by Vbif
да оно ваще не взлетит, даже после обработки напильником
#25 by Кащей
ВЫБРАТЬ не работает, если номерация не с 1, но легко исправимо
#26 by ДрДрТартл
то есть вы предлагаете вбить  в справочник  всю линейку цифр, а потом по коду  находить дырки??? поясните пожалуста структуру справочника проба
#27 by Кащей
Проба - это просто справочник, на котором тестировались дырки (дырки - это разрыв в нумерации справочника)
#28 by ДрДрТартл
только что проверил - не работает . Выдаёт начало дырок  но не все((((
#29 by Кащей
вместо него подставляйте свой источник
#30 by Кащей
цитирую : Не обязательно все сразу, достаточно если будет выодится первая попавшаяся "дырка". Этот запрос решает немного другую задачу - определить какой должен быть номер при сплошной нумерации. Заодно и показывает, с какого момента возникла дырка
#31 by ДрДрТартл
вбивал данные  1,2,3,4,5,6,7,15, 19,25,39 попробуйте Вы
#32 by ДрДрТартл
если исходить из цитата: "Не обязательно все сразу, достаточно если будет выодится первая попавшаяся "дырка"." то да, Вы совершенно правы. А вот бы придумать запрос который выводил все пропущенные номера
#33 by ДрДрТартл
кстати если   вбить те данные которые  я предложил то номер  7 не выводится
#34 by Кащей
ВЫБРАТЬ ИМЕЮЩИЕ    Проба.Код<>МАКСИМУМ(Проба1.Код)+1
#35 by Кащей
а он и не должен выводиться )
#36 by Кащей
Понял нестыковку. Нужно выводить значения дырок, а я показываю элементы, которые "не на местах". В принципе с учетом задача поиска "дырок" решена, но не в постановке
#37 by ДрДрТартл
|     читый плагиат, но зато в один столбик КАЩЕЮ РЕСПЕКТ
#38 by ДрДрТартл
ну проблема решается  добавлением единицы к конечному результату)))
#39 by Кащей
когда в два столбика было - получался готовый интервал дырок с "код1" по "код" не включая концы интервала.
#40 by ДрДрТартл
каюсь, признаю степень, глубину, меру(((((
#41 by Vbif
Если в постановке тогда модифицируем и получаем первую дырку ВЫБРАТЬ ПЕРВЫЕ 1 НомерИзНабора + 1 Из НАБОР ГДЕ НомерИзНабора + 1 Не В (Набор) а вот как выбрать все дырки? и именно дырки, а не начало и оконачние дырки и т.п.
#42 by Кащей
Есть частные решения, когда заведомо известно, что ширина максимальной дырки меньше количества элементов выборки
#43 by hhhh
ГДЕ   Набор2.Номер ЕСТЬ NULL И Набор.Номер > 1
#44 by Vbif
тот же только в профиль, ошибка при дырке в 2 элемента
#45 by hhhh
В условии задачи написано: "найти первую попавшуюся дырку".
#46 by Vbif
мы ее нашли в , потом встал вопрос найти все - вот и ищем :)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С