Главная страница
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.013 c
14-35016
BJValentine
2003-05-27 11:13
2003.06.12
rar


14-35040
Леприкон
2003-05-23 07:35
2003.06.12
Евровидение 2003


3-34712
Roka
2003-05-22 23:07
2003.06.12
DBGrid и текущая запись TTable


14-35055
Шоломицкий
2003-05-27 17:42
2003.06.12
Зацените пожалуйста мой сайт!


1-34873
spater
2003-05-31 15:24
2003.06.12
Создание отчета