Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.005 c
1-75598
Masa
2002-01-06 23:09
2002.01.24
Помогите написать алгоритм вычисления простых чисел из множества !!!


3-75482
Dim
2001-12-17 11:57
2002.01.24
Почему не правильно работает RecordCount?


3-75537
EternalWonderer
2001-12-19 12:26
2002.01.24
CREATE DOMAIN BOOL AS CHAR(1) DEFAULT N CHECK (VALUE IN ( Y , N ));


3-75533
DS
2001-12-19 17:35
2002.01.24
Создание Lookup полей программно


14-75657
Serega__2
2001-11-29 10:40
2002.01.24
Господа, а что с rxlib`ом случилось?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский