![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос [D5, Oracle, ]
sky3d © (2001-12-21 18:24:00)Есть таблица вида, где 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
Каким образом можно это сделать ?
Delirium (2001-12-21 20:51:00) [1]В общем добавляем ещё одно поле, заполняем:
(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, как обычно :)
petr_v_a (2001-12-21 20:08:00) [2]Если 8i Release 2 и выше, можно попробовать аналитическими ф-циями ( lead, lag, row_number и иже с ними ), но геморрой все равно хороший. "Примеров кода" сегодня не будет, т.к. ухожу пить пиво :)
sky3d (2001-12-21 19:54:00) [3]2Mick
что должна чделать SP я понял с первого ответа...
поподробнее хотелось бы узнать как это все описать внутри SP...
сорри убегаю, продолжим завтра
Delirium (2001-12-21 19:53:00) [4]>Mick
Поддерживаю, эта задача не для SQL
Mick (2001-12-21 19:49:00) [5]Создать хранимую процедуру, в ней открыть курсор упорядоченный по OP_NO.
Далее идти по нему вниз анализируя диапазоны и находя в них min и max.
Только проще это все же на клиенте сделать.
Delirium (2001-12-21 19:36:00) [6]Действительно, без доп.поля заделяющего "двойки" никак не обойтись :(
sky3d (2001-12-21 19:33:00) [7]Можно немного поподробнее по-поводу SP
Mick (2001-12-21 19:32:00) [8]И все таки еще раз:
Набор данных конечно на физическом сервере, а не на клиенте, но он там НЕУПОРЯДОЧЕН. Отсюда следует, что понятие "диапазон" появляется только тогда когда данные зафетчены на клиента с Order By.
VVP (2001-12-21 19:26:00) [9]Никак, без внесения дополнительных ключей не получиться. Вводишь еще одну колонку - ключ диапазона, делаешь по ней группбай и наслаждаешься.
Mick (2001-12-21 19:24:00) [10]"Order By" в подзапросах ?????
Тогда в SP открой курсор упорядоченный по OP_NO и иди по нему определяя границы диапазонов.
PS: Это решаемо. И это восе не так сложно. Недоразумение было исключительно по поводу того, что для CODE = 2 существует именно два диапазона.
sky3d (2001-12-21 19:15:00) [11]Опять нет !!!
Набор данных на физическом сервере, а не на клиенте
А запрос SELECT * FROM T ORDER BY OP_NO можно использовать и как ПОДЗАПРОСв сложных запросах . Я именно это и имел ввиду...
Вопрос стоит о том, при помощи каких средств Oracle (доселе мне неизвестных, к сожалению) получить результат непосредственно на сервере и возвратить на клиента результирующую выборку.
Вы считаете что это не решаемо или сами не знаете как это сделать ?
Mick (2001-12-21 19:08:00) [12]Про что я тебе и толковал.
Ты говоришь про набор данных который УЖЕ НА КЛИЕНТЕ. И никакие SQL запросы над ним выполнить уже нельзя.
sky3d (2001-12-21 19:05:00) [13]А вы сделайте выборку SELECT * FROM T ORDER BY OP_NO
и наслаждайтесь порядком...
Mick (2001-12-21 19:03:00) [14]А почему ты считаешь, что физически запись с OP_NO = 3 стоит именно в середине? Ведь только на основании этого предположения вырисовывается второй диапазон для CODE = 2.
sky3d (2001-12-21 19:00:00) [15]Не надо путать порядок ввода записей в таблицу и значение физического поля !!!
В нашем случае OP_NO является физическим полем и все возможные варианты запросов распространяются на него в полной мере...
Mick (2001-12-21 18:57:00) [16]Мартин Грабер по этому поводу говорит, что этот вопрос не решается SQL запросом.
Потому что на SQL сервере записи могут стоять совсем не в таком порядке как нарисовано у тебя. Даже если их вводили последовательно и последовательно увеличивали OP_NO.
Такой упорядоченный набор существует только на клиенте и на клиенте и надо искать MIN и MAX
sky3d (2001-12-21 18:47:00) [17]Не все так просто, внимательно смотрите на исходные данные и результаты..
В предложенном варианте получите для 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:32:00) [18]Прочитав "Введение в SQL" Мартина Грабера это можно сделать так:
Select CODE, MIN(OP_NO), MAX(OP_NO) From SomeTable
Group By CODE
Delirium (2001-12-21 18:32:00) [19]
select CODE,MIN(OP_NO),MAX(OP_NO) from My_Table
group by CODE
или я что-то не понял ?