Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизКак запросом получить интервалы ИД таблицы? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c