Форум: "Базы";
Текущий архив: 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, как обычно :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c