Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос  [new]
squirrel1
Guest
Есть таблица:
Номер Значение Количество
1           а         3  
2     
3
4           b         2
5
6           c         4 
7
8          d          1
9
10         e          1

Нужно получить такую:
1           а         3  
2           а
3           a
4           b         2
5           b
6           c         4 
7           c 
8           d         1
9           c
10          e         1

Помогите, пожалуйста, решить одним запросом... если возможно....
7 дек 06, 12:30    [3503731]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1313
Что то принцип непонятен. Строка с ИД=9 выбивается из общей картины
7 дек 06, 13:03    [3504018]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
squirrel1
Guest
"количество" указьівает скольким последующим строкам, начиная с текущей, будет присвоено значение. Т.е. если в строке 8 количество 1, то так и остается, девятая строка не меняется.
7 дек 06, 13:08    [3504068]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Душераздираааающее зрелище... :-(
7 дек 06, 13:16    [3504146]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
squirrel1
"количество" указьівает скольким последующим строкам, начиная с текущей, будет присвоено значение. Т.е. если в строке 8 количество 1, то так и остается, девятая строка не меняется.
В лоб:
select t1.rn, (select max(t2.val) from t t2 where t1.rn between t2.rn and t2.rn + t2.cnt - 1) as val, t1.cnt from t t1
7 дек 06, 13:21    [3504199]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
Уважаемый автор, а для такой таблички:

RN	VAL	CNT
1	a	3
2		
3		
4	b	2
5		
6	c	4
7		
8	b	1
9		
10	e	1

что должно быть в результате в 9-й строке?
7 дек 06, 14:40    [3504917]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
vallkor
что должно быть в результате в 9-й строке?


Т.е. я хотел сказать в 8-й :)
7 дек 06, 14:41    [3504930]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116138
vallkor
vallkor
что должно быть в результате в 9-й строке?


Т.е. я хотел сказать в 8-й :)


Никакой разницы с примером автора не вижу.
ИМХО b
7 дек 06, 14:43    [3504957]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
squirrel1
Есть таблица:
Номер Значение Количество
1           а         3  
2     
3
4           b         2
5
6           c         4 
7
8          d          1
9
10         e          1

Нужно получить такую:
1           а         3  
2           а
3           a
4           b         2
5           b
6           c         4 
7           c 
8           d         1
9           c
10          e         1

Помогите, пожалуйста, решить одним запросом... если возможно....

значит еще двух значений не хватает?(не понял,где еще c),и почему не по порядку идут c?
7 дек 06, 14:44    [3504969]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
vallkor
vallkor
что должно быть в результате в 9-й строке?
Т.е. я хотел сказать в 8-й :)
max(t2.val) keep (dense_rank last order by t2.rn)
7 дек 06, 14:46    [3504981]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
ModelR
Member

Откуда: Нижний Новгород
Сообщений: 1798
Номер Значение Количество
6           c         4 
7
8          d          2
9 

9 Что и почему?
7 дек 06, 14:52    [3505026]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
squirrel1
Guest
'C' по идее должно бьіть с 6 по 9 включительно, но т.к. в 8 встречается другое значение, то оно перекрьівает последовательность из 'c', если бьі в 8 строке бьіло d - 2,
то результат бьіл бьі таким:
6 с
7 с
8 d
9 d
10 e
7 дек 06, 14:53    [3505037]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
Вот набросал вариант с pivot таблицей.
Т.е. он не учитывает есть ли там нулл строки, но мне кажется и это "докрутить" недолго.

create table t(rn number, v char(2), c number);
insert into t values(1,'a',3);
insert into t values(2,null,null);
insert into t values(3,null,null);
insert into t values(4,'b',1);
insert into t values(5,null,null);
insert into t values(6,'c',4;
insert into t values(7,null,null);
insert into t values(8,'d',2;
insert into t values(9,null,null);
commit;


SELECT   rn + t - 1 rn2, MAX (v)KEEP (DENSE_RANK FIRST ORDER BY t),
         MAX (DECODE (t, 1, c, NULL)) d
    FROM (SELECT   rn, v, c, ROW_NUMBER () OVER (PARTITION BY v ORDER BY rn)
                                                                            t
              FROM t,
                   (SELECT ROWNUM arn
                      FROM all_objects) a
             WHERE v IS NOT NULL AND t.c >= arn
          ORDER BY rn + t - 1)
GROUP BY rn + t - 1


      RN2 MA          D
--------- -- ----------
        1 a           6
        2 a
        3 a
        4 b           1
        5 a
        6 c           4
        7 c
        8 d           2
        9 d


Гуру в SQL , покритикуйте
7 дек 06, 15:07    [3505156]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Stax.
Guest
Мой любимый
  1  select
  2   rn
  3  ,max(v) over (partition by g) mv
  4  ,c
  5* from (select t.*,sum(decode(v,null,0,1)) over (order by rn) g from t)
SQL> /

       RN MV         C
--------- -- ---------
        1 a          3
        2 a
        3 a
        4 b          1
        5 b
        6 c          4
        7 c
        8 d          2
        9 d

9 rows selected.
.....
stax
7 дек 06, 15:36    [3505414]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
Mikst
покритикуйте
После
delete t where v is null and rownum < dbms_random.value(1,10)
результат не изменится. Да и сам подход весьма подозрителен.
7 дек 06, 15:38    [3505422]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Stax.
        9 d
Надо не просто дырки заполнить..
7 дек 06, 15:43    [3505461]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
Stax.
Мой любимый
Не работает на данных автора (см. пост Jannny).

Stax.
sum(decode(v,null,0,1))
Картинка с другого сайта.:
count(v)
7 дек 06, 15:46    [3505498]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
В лоб:
select t1.rn, (select max(t2.val) from t t2 where t1.rn between t2.rn and t2.rn + t2.cnt - 1) as val, t1.cnt from t t1
Кстати max от val тоже как-то... :)
7 дек 06, 15:48    [3505509]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Mikst
        9 d
Э... Вы результат руками что ли писали? ;) Или у Вас он действительно это возвращает?
7 дек 06, 15:49    [3505522]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
Jannny
Elic
select t1.rn, (select max(t2.val) from t t2 where t1.rn between t2.rn and t2.rn + t2.cnt - 1) as val, t1.cnt from t t1
Кстати max от val тоже как-то... :)
А у меня уже был запасной вариант :)
Тем более автор не особо распространялся о принципах разрешения конфликтов. Так что не вижу надобности надуманно и преждевременно фантазировать :)
7 дек 06, 15:55    [3505584]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
dmidek
Никакой разницы с примером автора не вижу.
ИМХО b


Elic понял, о чем я говорю ;)
7 дек 06, 15:57    [3505603]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Так что не вижу надобности надуманно и преждевременно фантазировать :)
Ну с тем, что туда как минимум nvl стоит добавить, ты не будешь спорить? Совершенно "ненадуманно" ставим в 6ую строку вместо с - k...
7 дек 06, 15:59    [3505620]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
Jannny
Mikst
        9 d
Э... Вы результат руками что ли писали? ;) Или у Вас он действительно это возвращает?


Зачем руками:
SQL> select * from t;

        RN V           C
---------- -- ----------
         1 a           6
         2
         3
         4 b           1
         5
         6 c           4
         7
         8 d           2
         9

9 строк выбрано.

SQL> select rn+t-1 rn2, max(v) keep (dense_rank first order by t), max(decode(t,1,c,null)) d from
  2  (
  3  select rn, v ,c, row_number() over (partition by v order by rn) t from t, (select rownum arn fr
om all_objects) a
  4   where v is not null 
  5   and t.c>=arn
  6   order by rn+t-1
  7  )group by rn+t-1 ;

       RN2 MA          D
---------- -- ----------
         1 a           6
         2 a
         3 a
         4 b           1
         5 a
         6 c           4
         7 c
         8 d           2
         9 d

9 строк выбрано.

SQL> 

То Elic , я упоминул, что запрос не учитывает кол-во нулл строк. Нужно докрутить.
А чем подход не нравится?
7 дек 06, 16:02    [3505656]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
vallkor
Member

Откуда: Киев
Сообщений: 162
Jannny
Совершенно "ненадуманно" ставим в 6ую строку вместо с - k...


Это уже фиксилось.
7 дек 06, 16:03    [3505668]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Stax.
Guest
Jannny
Stax.
        9 d
Надо не просто дырки заполнить..

я этой 9-й вооооообще не понял

, если бьі в 8 строке бьіло d - 2,

что меняет d-1?
что будет если?

RN	VAL	CNT
1	a	10
....
....
stax
7 дек 06, 16:04    [3505671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить