Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-34776
Uran
2003-06-02 11:39
2003.06.12
Работа с файлом.


14-35003
mox
2003-05-26 18:59
2003.06.12
Mail


3-34731
AGAMEMNUM
2003-05-20 10:23
2003.06.12
Access


1-34874
Seldon
2003-05-31 16:16
2003.06.12
Передача данных


8-34943
Still Swamp
2002-02-04 15:22
2003.06.12
GLScene - несколько вопросов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский