Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];




Вниз

SQL запрос 


sky3d   (2001-12-21 18:24) [0]

Есть таблица вида, где OP_NO - номера по порядку
OP_NO CODE
1 2 // диапазон OP_NO = [1..2]
2 2
3 99 // диапазон OP_NO = [3..3]
4 2 // диапазон OP_NO = [4..6]
5 2
6 2
необходимо получить выборку минимального и максимального OP_NO
для каждого CODE
CODE MIN(OP_NO) MAX(OP_NO)
2 1 2
99 3 3
2 4 6
Каким образом можно это сделать ?



Mick   (2001-12-21 18:32) [1]

Прочитав "Введение в SQL" Мартина Грабера это можно сделать так:

Select CODE, MIN(OP_NO), MAX(OP_NO) From SomeTable
Group By CODE



Delirium   (2001-12-21 18:32) [2]


select CODE,MIN(OP_NO),MAX(OP_NO) from My_Table
group by CODE

или я что-то не понял ?



sky3d   (2001-12-21 18:47) [3]

Не все так просто, внимательно смотрите на исходные данные и результаты..
В предложенном варианте получите для Code = 2 значения 1 и 6
а необходимо получать отдельный результат для каждого измененного (отличного от предыдущего) CODE при просмотре OP_NO по-порядку 1..N
OP_NO CODE
1 2 <- CODE изменился 1-й раз
2 2
3 99 <- CODE изменился 2-ой раз
4 2 <- CODE изменился 3-й раз
5 2
6 2

и введение в SQL здесь не катит...Что на это ответит Мартин Грабер ?



Mick   (2001-12-21 18:57) [4]

Мартин Грабер по этому поводу говорит, что этот вопрос не решается SQL запросом.
Потому что на SQL сервере записи могут стоять совсем не в таком порядке как нарисовано у тебя. Даже если их вводили последовательно и последовательно увеличивали OP_NO.
Такой упорядоченный набор существует только на клиенте и на клиенте и надо искать MIN и MAX



sky3d   (2001-12-21 19:00) [5]

Не надо путать порядок ввода записей в таблицу и значение физического поля !!!
В нашем случае OP_NO является физическим полем и все возможные варианты запросов распространяются на него в полной мере...



Mick   (2001-12-21 19:03) [6]

А почему ты считаешь, что физически запись с OP_NO = 3 стоит именно в середине? Ведь только на основании этого предположения вырисовывается второй диапазон для CODE = 2.



sky3d   (2001-12-21 19:05) [7]

А вы сделайте выборку SELECT * FROM T ORDER BY OP_NO
и наслаждайтесь порядком...



Mick   (2001-12-21 19:08) [8]

Про что я тебе и толковал.
Ты говоришь про набор данных который УЖЕ НА КЛИЕНТЕ. И никакие SQL запросы над ним выполнить уже нельзя.



sky3d   (2001-12-21 19:15) [9]

Опять нет !!!
Набор данных на физическом сервере, а не на клиенте
А запрос SELECT * FROM T ORDER BY OP_NO можно использовать и как ПОДЗАПРОС в сложных запросах . Я именно это и имел ввиду...

Вопрос стоит о том, при помощи каких средств Oracle (доселе мне неизвестных, к сожалению) получить результат непосредственно на сервере и возвратить на клиента результирующую выборку.
Вы считаете что это не решаемо или сами не знаете как это сделать ?



Mick   (2001-12-21 19:24) [10]

"Order By" в подзапросах ?????

Тогда в SP открой курсор упорядоченный по OP_NO и иди по нему определяя границы диапазонов.

PS: Это решаемо. И это восе не так сложно. Недоразумение было исключительно по поводу того, что для CODE = 2 существует именно два диапазона.



VVP   (2001-12-21 19:26) [11]

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



Mick   (2001-12-21 19:32) [12]

И все таки еще раз:
Набор данных конечно на физическом сервере, а не на клиенте, но он там НЕУПОРЯДОЧЕН. Отсюда следует, что понятие "диапазон" появляется только тогда когда данные зафетчены на клиента с Order By.



sky3d   (2001-12-21 19:33) [13]

Можно немного поподробнее по-поводу SP



Delirium   (2001-12-21 19:36) [14]

Действительно, без доп.поля заделяющего "двойки" никак не обойтись :(



Mick   (2001-12-21 19:49) [15]

Создать хранимую процедуру, в ней открыть курсор упорядоченный по OP_NO.
Далее идти по нему вниз анализируя диапазоны и находя в них min и max.
Только проще это все же на клиенте сделать.



Delirium   (2001-12-21 19:53) [16]

>Mick
Поддерживаю, эта задача не для SQL



sky3d   (2001-12-21 19:54) [17]

2Mick
что должна чделать SP я понял с первого ответа...
поподробнее хотелось бы узнать как это все описать внутри SP...

сорри убегаю, продолжим завтра



petr_v_a   (2001-12-21 20:08) [18]

Если 8i Release 2 и выше, можно попробовать аналитическими ф-циями ( lead, lag, row_number и иже с ними ), но геморрой все равно хороший. "Примеров кода" сегодня не будет, т.к. ухожу пить пиво :)



Delirium   (2001-12-21 20:51) [19]

В общем добавляем ещё одно поле, заполняем:
(MSSQL)

declare cur cursor scroll
for select OP_NO,CODE from Test order by OP_NO
open cur
declare @C int
declare @C2 int
declare @I int Set @I=1
declare @ID int
fetch first from cur into @ID,@C
Set @C2=@C
while (@@FETCH_STATUS=0)
begin
if @C<>@C2
begin
Set @I=@I+1
Set @C2=@C
end
UPDATE Test SET OP_NO_2=@I WHERE OP_NO=@ID
fetch next from cur into @ID,@C
end
close cur
deallocate cur

а дальше min/max, как обычно :)




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.016 c
14-75648          Mike_Goblin           2001-11-26 14:29  2002.01.24  
День Варенья у Sir Alex


3-75528           Atrem                 2001-12-21 12:01  2002.01.24  
Tblobstream и TIBQuery


6-75630           Yuraz                 2001-10-29 09:30  2002.01.24  
Есть URL сайта, какой командой TCP воспользоваться, чтобы узнать чей он, на кого зарегистр. где, когда..


1-75616           Lotus                 2002-01-05 17:33  2002.01.24  
Нужно интерпретировать математические выражения


1-75573           Lotus                 2002-01-05 15:27  2002.01.24  
Проверка выражения на true/false НУЖНА ПОМОЩЬ!!!