Имя: Пароль:
1C
 
Поймать дырку в последовательности
0 ДенисЧ
 
12.09.09
08:45
Есть таблица (sql, если важно). В ней числа 1,2,3,5,6,8,... В общем возрастающая последовательность натруальных чисел с возможными дырками.

Хочется каким-то хитрым запросом поймать все эти дырки...

Как, кроме как тупым циклом?
1 dk
 
12.09.09
08:47
незанятые коды ищешь?
2 Rie
 
12.09.09
08:49
(0) IMHO, никак. Если у дырки нет никаких примет, кроме того, что она - дырка.
3 ДенисЧ
 
12.09.09
08:49
(1) Не совсем коды, но нечто в таком роде.
(2) У неё одна примета - она не попадает в ряд :-)
4 Mikeware
 
12.09.09
08:51
Ну, сгенерить таблицу "полной последовательности", сджойниться с ней, и выбрать незадвоенные
5 ДенисЧ
 
12.09.09
08:51
(4) Ну, так и я могу :-)
6 Rie
 
12.09.09
08:53
Абстрактная мысль - попробовать приспособить к этому делу двоичный поиск.
7 Rie
 
12.09.09
08:55
+(6) Если дырок мало - при двоичном поиске можно сразу отбрасывать "бездырочные" сегменты.
8 orefkov
 
12.09.09
08:55
select t1.val, (select max(t2.val) from tt t2 where t2.val < t1.val)
from tt t1
where t1.val != 1 + (select max(t2.val) from tt t2 where t2.val < t1.val)

вот как-то так
9 dk
 
12.09.09
08:56
можно извратиться, но вот будет ли это быстрее ... ?
например
1. обрезать последний код до десятков
2. сделать запрос тип select Count(*) Количество,(Code % 10) as ПоследняяЦифра from .. group by (Code % 10)
3. получили что количество последних цифр неравномерно и можно сократить область поиска
При большой последовательности можно определять последние 2, 3, 4, ... цифры
10 dk
 
12.09.09
09:00
2. +
select Count(*) Количество,(Code % 10) as ПоследняяЦифра from .. group by (Code % 10) where Code < МасксимальныйКодОбрезанныйДоДелителя
)))
11 ДенисЧ
 
12.09.09
09:00
(8) А вот это дело. Спасибо!
12 orefkov
 
12.09.09
09:10
(11)
Если поле индексировано - нормально отработает.
Хотя тупым банальным циклом - самое оптимальное в плане производительности.
Если есть возможность процедур - организовать на сервере.
Иначе - тупой select + цикл на клиенте.
13 ДенисЧ
 
12.09.09
09:11
(12) Разумеется, индексировано. Уже проверил - даёт то, что мне нужно.
14 Sadovnikov
 
23.09.09
13:14
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.