Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.12;
Скачать: CL | DM;

Вниз

Как запросом получить интервалы ИД таблицы?   Найти похожие ветки 

 
Snv-Soft   (2003-05-22 07:27) [0]

Всем привет! У таблицы ИД 1,2,3,6,7,11,15,16,17.....
Надо чтобы запрос вернул 1-3,6-7,11,15-17 ...
У кого-нибудь есть мысли насчет оптимального алгоритма.
Заранее спасибо.


 
Иван Шихалев ©   (2003-05-22 07:57) [1]

Только через ХП. Достаточно тривиально по for select и промежуточную переменную.


 
Snv-Soft   (2003-05-22 08:51) [2]

Гляньте... с ходу наваял..мож кто-нибудь подскажет как проще можно..Буду благодарен
Табличка IN_FORMS... Поле с ИД - NUMBER

CREATE PROCEDURE NUM_TEST
RETURNS (
PERIOD VARCHAR(50))
AS
DECLARE VARIABLE NUMBER INTEGER;
DECLARE VARIABLE BP INTEGER;
DECLARE VARIABLE EP INTEGER;
DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE LASTNUMBER INTEGER;
begin
EP = 0;
CNT = 0;

SELECT MIN(NUMBER), MAX(NUMBER)
FROM IN_FORMS
INTO :BP, :LASTNUMBER;

FOR SELECT NUMBER
FROM IN_FORMS
ORDER BY NUMBER
INTO :NUMBER
DO
BEGIN
CNT = CNT + 1;
IF ((NUMBER > CNT) or (NUMBER = LASTNUMBER)) THEN
BEGIN
if (NUMBER < LASTNUMBER) then EP = CNT - 1;
else EP = NUMBER;
PERIOD = CAST (BP AS VARCHAR(25)) ||"-"||CAST (EP AS VARCHAR(25));
SUSPEND;
BP = NUMBER;
CNT = NUMBER;
END
END
END


 
Johnmen ©   (2003-05-22 09:34) [3]

Привожу в очередной раз пример запроса, возвращающего "дырки" :

SELECT T.ID+1, MIN(T1.ID)-1, MIN(T1.ID)-T.ID-1
FROM TABLE1 T
JOIN TABLE1 T1 ON T.ID<T1.ID
WHERE T.ID<=1000 AND T1.ID<=1000
GROUP BY T.ID
HAVING MIN(T1.ID)-T.ID>1


Получаем промежутки с пропущенными значениями ID.
В первой колонке будет начальный ID промежутка, во второй - конечный.
В третьей количество пропущенных ID в промежутке.

1000 - число, до которого значения ID нас интересуют


 
Иван Шихалев ©   (2003-05-22 12:34) [4]


create procedure GET_RANGES
returns (
START_ID integer,
FINAL_ID integer)
as delcare variable LAST_ID integer;
declare variable FLAG integer;
begin
FLAG = 1;
LAST_ID = -1;
for select ID from MY_TABLE
into :FINAL_ID
do begin
if (FLAG = 1)
then begin
START_ID = FINAL_ID;
FLAG = 2;
end
else begin
if (FINAL_ID-LAST_ID > 1)
then begin
suspend;
FLAG = 1;
end
LAST_ID = FINAL_ID;
end
end
end


 
Johnmen ©   (2003-05-22 12:44) [5]

>Иван Шихалев © (22.05.03 12:34)

Рекомендую перед выкладыванием конкретного кода производить его тестирование...:)


 
Иван Шихалев ©   (2003-05-22 14:37) [6]

И что там кроме опечатки в delcare?


 
Иван Шихалев ©   (2003-05-22 14:39) [7]

И так до кучи - это не конкретный, а примерный код. Я конкретных кодов в конференции не пишу.

PS. В коде еще order by ID должно быть.



Страницы: 1 вся ветка

Текущий архив: 2003.06.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
1-34842
Jaxtor
2003-05-29 17:18
2003.06.12
Как обойти при отладке модули Ehlib


3-34679
Snv-Soft
2003-05-22 07:27
2003.06.12
Как запросом получить интервалы ИД таблицы?


3-34762
tytus
2003-05-25 10:52
2003.06.12
DBGrid


14-35059
Chris
2003-05-27 22:17
2003.06.12
Описание iphlpapi.dll


3-34721
Darts
2003-05-23 14:54
2003.06.12
Помогите с запросом