Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Максимальное значение, меньше текущего.  [new]
TempGuest
Guest
Есть таблица.

Rownumber ||||| Name ||||| Value

1 Igor 1
2 Igor 3
3 Igor 5
4 Igor 4
5 Egor 10
6 Egor 15
7 Egor 20
8 Egor 13

Нужно найти максимальное значение, меньше текущего. И отдельно для каждого имени.

Т.е. для второй строки, это "1", для третьей - "3", для четвертой - "3", для шестой строки - "10", для седьмой "15", для восьмой - "10". Первые строчки в каждой группе сделать NULL'ами. Я понимаю, что это, скорее всего, делается аналитическими функциями( row_number() ), и что есть уже подобная тема - https://www.sql.ru/forum/actualthread.aspx?tid=518042 ,но перенести на свою задачу я не могу, В силу самообучения с помощью гугла.
23 окт 12, 12:16    [13361448]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
TempGuest,

аналитическими функциями - это да, только вот ни разу не row_number.
если нужен максимум - таки используйте максимум. а аналитика пригодится для определения диапазона (т.е. окна) подходящего для поиска в контексте каждой строки
23 окт 12, 12:43    [13361724]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
TempGuest,

SELECT R.r, CASE  WHEN R.v < max_ THEN R.v ELSE max_ END, R.n FROM (

WITH tst AS (
select 1 AS R, 'Igor' AS N, 1 AS V from dual
UNION
select 2 AS R, 'Igor' AS N, 3 AS V from dual
UNION
select 3 AS R, 'Igor' AS N, 5 AS V from dual
UNION
select 4 AS R, 'Igor' AS N, 4 AS V from dual
UNION
select 5 AS R, 'Egor' AS N, 10 AS V from dual
UNION
select 6 AS R, 'Egor' AS N, 15 AS V from dual
UNION
select 7 AS R, 'Egor' AS N, 20 AS V from dual
UNION
select 8 AS R, 'Egor' AS N, 13 AS V from dual)

SELECT T.R
     , T.V
     , T.N
     , MAX(V) OVER (PARTITION BY T.N) max_
  FROM tst T
ORDER BY 1) R;
23 окт 12, 15:45    [13363414]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Добрый Э - Эх
Guest
Максим Н, сам-то свой запрос пробовал? Ничего, что он даже не удовлетворяет исходным требованиям автора?
23 окт 12, 15:49    [13363455]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Добрый Э - Эх
Guest
Максим Н,
Автору нужен такой вот результат:
with t as 
(
select 1 as rownumber, 'Igor' as name,  1 as value from dual union all
select 2 as rownumber, 'Igor' as name,  3 as value from dual union all
select 3 as rownumber, 'Igor' as name,  5 as value from dual union all
select 4 as rownumber, 'Igor' as name,  4 as value from dual union all
select 5 as rownumber, 'Egor' as name, 10 as value from dual union all
select 6 as rownumber, 'Egor' as name, 15 as value from dual union all
select 7 as rownumber, 'Egor' as name, 20 as value from dual union all
select 8 as rownumber, 'Egor' as name, 13 as value from dual)

select rownumber, name, value,
       (select max(value) from t t1 where t1.rownumber < t0.rownumber and t1.value < t0.value and t1.name = t0.name) as x_value
  from t t0
order by rownumber

Query finished, retrieving results...

ROWNUMBER   NAME   VALUE   X_VALUE
---------   ----   -----   -------
        1   Igor       1
        2   Igor       3         1
        3   Igor       5         3
        4   Igor       4         3
        5   Egor      10
        6   Egor      15        10
        7   Egor      20        15
        8   Egor      13        10

8 row(s) retrieved

но только на аналитике
23 окт 12, 15:55    [13363502]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Добрый Э - Эх,
автор
максимальное значение, меньше текущего

"R""CASEWHENR.V<MAX_THENR.VELSEMAX_END""N"
11"Igor"
23"Igor"
35"Igor"
44"Igor"
510"Egor"
615"Egor"
720"Egor"
813"Egor"
23 окт 12, 16:02    [13363567]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Добрый Э - Эх
Guest
Максим Н
Добрый Э - Эх,
автор
максимальное значение, меньше текущего

"R""CASEWHENR.V<MAX_THENR.VELSEMAX_END""N"
11"Igor"
23"Igor"
35"Igor"
44"Igor"
510"Egor"
615"Egor"
720"Egor"
813"Egor"


То есть, чукча не читатель ни разу?
TempGuest
Т.е. для второй строки, это "1", для третьей - "3", для четвертой - "3", для шестой строки - "10", для седьмой "15", для восьмой - "10". Первые строчки в каждой группе сделать NULL'ами.

Вроде автор вполне себе доходчиво описал требуемый результат...
23 окт 12, 16:04    [13363593]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Добрый Э - Эх,

Пардон, переклинило ....
23 окт 12, 16:04    [13363594]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Добрый Э - Эх

То есть, чукча не читатель ни разу?
TempGuest
Т.е. для второй строки, это "1", для третьей - "3", для четвертой - "3", для шестой строки - "10", для седьмой "15", для восьмой - "10". Первые строчки в каждой группе сделать NULL'ами.

Вроде автор вполне себе доходчиво описал требуемый результат...

читатель читатель ...
23 окт 12, 16:06    [13363609]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
123йй
Guest
Добрый Э - Эх,
7 Egor 20 15
8 Egor 13 10
???
select t.rownumber, t.name,t.value,max(lg) over(partition
by name order by rownumber) mx from (
select t.rownumber,value, t.name,lag(value) over (partition
by name order by rownumber) lg from t
) t order by rownumber;
23 окт 12, 16:29    [13363845]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
123йй
Guest
123йй,

поторопился
23 окт 12, 16:31    [13363868]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Дословно
Guest
TempGuest
максимальное значение, меньше текущего. И отдельно для каждого имени.
max(v) over (partition by n order by v range between unbounded preceding and 1 preceding)
23 окт 12, 16:34    [13363884]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Дословно,

Круто.
23 окт 12, 16:38    [13363916]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Добрый Э - Эх
Guest
Максим Н
Дословно,

Круто.
Njkmrj Только работает неправильно. Даже на твоем примере...
23 окт 12, 17:16    [13364286]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение, меньше текущего.  [new]
Очень дословно
Guest
Добрый Э - Эх
Максим Н
Дословно,

Круто.
Только работает неправильно. Даже на твоем примере...
Неправильно решает какую задачу:
  • максимальное значение, меньше текущего. И отдельно для каждого имени
  • максимальное предыдущее значение, меньше текущего. И отдельно для каждого имени
  • ...?
  • 23 окт 12, 17:49    [13364551]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    123йй
    Guest
    Очень дословно,
    читай
    автор
    меньше текущего

    та же ошибка что и у меня 2 постами выше
    23 окт 12, 17:52    [13364573]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    132йй
    Guest
    123йй
    Очень дословно,
    читай
    автор
    меньше текущего
    та же ошибка что и у меня 2 постами выше
    И где это нарушено?
                R             V N            MAX_V
    ------------- ------------- ---- -------------
                1             1 Igor
                2             3 Igor             1
                3             5 Igor             4
                4             4 Igor             3
                5            10 Egor
                6            15 Egor            13
                7            20 Egor            15
                8            13 Egor            10
    
    23 окт 12, 18:05    [13364651]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    Добрый Э - Эх
    Guest
    Очень дословно,

    Автор же написал, какой результат ему нужен. Легко заметить, что твой запрос не дает этого результата...
    23 окт 12, 18:10    [13364687]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    Добрый Э - Эх
    Guest
    132йй
    И где это нарушено?
                R             V N            MAX_V
    ------------- ------------- ---- -------------
                1             1 Igor
                2             3 Igor             1
                3             5 Igor             4
                4             4 Igor             3
                5            10 Egor
                6            15 Egor            13
                7            20 Egor            15
                8            13 Egor            10
    


    Автор хочет как бы такого результата:

                R             V N            MAX_V
    ------------- ------------- ---- -------------
                1             1 Igor
                2             3 Igor             1
                3             5 Igor             3
                4             4 Igor             3
                5            10 Egor
                6            15 Egor            10
                7            20 Egor            15
                8            13 Egor            10
    
    23 окт 12, 18:11    [13364697]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    Таки очень дословно
    Guest
    Добрый Э - Эх
    Автор же написал, какой результат ему нужен.
    Ребята, вы понимаете значение фразы "очень дословно"?
    И с как пор модно доверять противоречивым авторам?
    23 окт 12, 18:21    [13364759]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    init.ora
    Member

    Откуда: гетто
    Сообщений: 317
    select id,n,v,stat
       from(
         select id,n,v,m,s ,case when s=1 then m else lag(v)over(order by v) end stat
         from(
         select id,n,v,m,case when v>m then 1 else 0 end s
         from(
           select id,n,v, 
           max(v)over(order by id rows between unbounded preceding and 1 preceding) m
         from x
       )z2
     )z3
    )z4
    order by id
    



    может так как нибудь?
    оракла нет под рукой , проверить никак.(
    23 окт 12, 22:06    [13365508]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    init.ora
    Member

    Откуда: гетто
    Сообщений: 317
    ну а первое значение в Null для групп уже не проблема поставить
    23 окт 12, 22:08    [13365510]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    init.ora
    Member

    Откуда: гетто
    Сообщений: 317
    ну и для повторных значений VALUE надо по-другому немного переписать
    23 окт 12, 22:10    [13365515]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    init.ora
    Member

    Откуда: гетто
    Сообщений: 317
    не, фигня.))
    23 окт 12, 22:18    [13365533]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение, меньше текущего.  [new]
    init.ora
    Member

    Откуда: гетто
    Сообщений: 317
    with x as(
    select id,g,a ...
    )
    
    select id,g,a,
    case stat when 0 then null
    else lag(a,r1-stat)over(order by r1) s
    from(
    	select z.*,
    	case when m2>m1 then m1-1 else
    	case instr(m||'','1', m1-m2+1) when 0 then 0 else m1 - instr(m||'','1', m1-m2+1) end
    	end stat
    	from(
    		select id,g,a,r1,r2,m1 m, length(m1) m1, length(m2) m2
    		from(
    			select 
    			id,g,a,r1,r2,
    			sum(power(10,r1))over(order by id rows between unbounded preceding and 1 preceding) m1,
    			power(10,r1) m2
    			from(
    				select id,g,a,
    				row_number()over(order by a) r1,
    				row_number()over(order by id) r2
    				from x
    			)z1
    		)z2
    	)z3
    )z4
    


    ужас , конечно(:

    интересно посмотреть на нормальное решение сугубо аналитическими функциями.
    24 окт 12, 11:18    [13367234]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Oracle Ответить