Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с запросиком2 )  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
Развитие

Имеется:
with t as(
      select 1301 id  ,'a' name, 1 pos from dual union all
      select 1052 id  ,'b' name, 2 pos from dual union all
      select 1052 id  ,'b' name, 3 pos from dual union all
      select 1898 id  ,'c' name, 4 pos from dual union all
      select 1253 id  ,'d' name, 5 pos from dual union all
      select 1908 id  ,'e' name, 6 pos from dual 
      )
    select * from t t1
    inner join t t2 on t1.pos=t2.pos-1 -- ОБЪЕДИНЯЕТСЯ
    where  mod(t1.pos,2) = 1
  ;
Результат:

1301 a 1 1052 b 2
1052 b 3 1898 c 4
1253 d 5 1908 e 6

А как получить вот такой:

1301 1301 a 1 1052 b 2
1301 1052 b 3 1898 c 4
1301 1253 d 5 1908 e 6

(т.е. добавить столбец там где pos=1)
14 июл 08, 11:27    [5928684]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
Это развитие темы https://www.sql.ru/forum/actualpost.aspx?bid=3&tid=573786&mid=5895050&p=1&act=quot
14 июл 08, 11:27    [5928693]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Нельзя сказать, что Вы понятно объяснили... Что например, делать, если их(с pos=1) несколько или ни одного?

first_value(t1.id) over (order by decode(t1.pos, 1, 1))
14 июл 08, 11:32    [5928739]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
Димитрий85
Это развитие темы https://www.sql.ru/forum/actualpost.aspx?bid=3&tid=573786&mid=5895050&p=1&act=quot


Допустим запрос возвращает:
id name pos
1301 a 1
1052 b 2
1052 b 3
1898 c 4
надо из него сотворить:
id1 name1 pos1 id2 name2 pos2
1301 a 1 1052 b 2
1052 b 3 1898 c 4

т.е. первая позиция всегда объединяется в строку со второй, третья с четвертой итд...
14 июл 08, 11:42    [5928808]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
C#C++
Member [заблокирован]

Откуда: Суровые северные земли
Сообщений: 2636
Димитрий85
Развитие

Имеется:
with t as(
      select 1301 id  ,'a' name, 1 pos from dual union all
      select 1052 id  ,'b' name, 2 pos from dual union all
      select 1052 id  ,'b' name, 3 pos from dual union all
      select 1898 id  ,'c' name, 4 pos from dual union all
      select 1253 id  ,'d' name, 5 pos from dual union all
      select 1908 id  ,'e' name, 6 pos from dual 
      )
    select * from t t1
    inner join t t2 on t1.pos=t2.pos-1 -- ОБЪЕДИНЯЕТСЯ
    where  mod(t1.pos,2) = 1
  ;
Результат:

1301 a 1 1052 b 2
1052 b 3 1898 c 4
1253 d 5 1908 e 6

Между прочим, этот вариант с объединением неоптимальный и устаревший.
Есть функция lag специально для этого
14 июл 08, 11:48    [5928861]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
C#C++

Между прочим, этот вариант с объединением неоптимальный и устаревший.
Есть функция lag специально для этого


Моя квалификация позволяет применять устаревшие варианты )

Подскажите пожалуйста что-нибудь по существу. В том числе и с использованием функции Lag
14 июл 08, 11:51    [5928895]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросиком2 )  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
Димитрий85

...
Подскажите пожалуйста что-нибудь по существу. В том числе и с использованием функции Lag


Нашел вот:
select n, m, lag(m,1) over (order by n) "Previous M" from lag_exp;
N M Previous M
---------- ---------- ----------
1 6
2 12 6
3 5 12
4 11 5
5 4 11
6 10 4
7 3 10
8 9 3
9 2 9
10 8 2
11 1 8
12 7 1
13 0 7
14 6 0
15 12 6
16 5 12
17 11 5
18 4 11
19 10 4
20 3 10
14 июл 08, 11:53    [5928915]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить