![]() |
|
Поймать дырку в последовательности | ☑ | ||
---|---|---|---|---|
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
|
(13) А глянь в веточку
Получение остатков за период на каждый день SQL |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |