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

Откуда: Нск
Сообщений: 77
есть таблица
with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -5     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -1     from dual union all  
select 43,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
нужно выбрать id-шники пар по полю col, для которых qty=-qty
т.е. запросом должны выбраться id-шники:11,12,21,22,31,33,41,42
т.к. пары (11,12),(21,22),(31,32),(41,42)
21 окт 10, 08:37    [9646028]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
ошибся, т.е. запросом должны выбраться id-шники:11,12,21,22,31,32,41,42
коряво как-то описал но интуитивно должно быть понятно, группируем по col
строки и выводим те для которых есть пара qty=-qty, может быть несколко пар с одним col и c одинаковыми qty, типа как (11,12) и (31,32) где qty= 1,-1
21 окт 10, 08:50    [9646083]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
-2-
Member

Откуда:
Сообщений: 15330
vyv,

многие ко многим. по какому принципу (41,42) и (11,12), а не (11,33) и (41,43)
21 окт 10, 09:13    [9646184]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -5     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -1     from dual union all  
select 43,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
select t1.id, t2.id
from tbl t1
inner join tbl t2
on t1.col = t2.col and (t1.qty = (t2.qty*-1))
21 окт 10, 09:13    [9646188]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
Ramin
with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -5     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -1     from dual union all  
select 43,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
select t1.id, t2.id
from tbl t1
inner join tbl t2
on t1.col = t2.col and (t1.qty = (t2.qty*-1))

результат не:
11,12,21,22,31,33,41,42
21 окт 10, 09:15    [9646200]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
-2-
vyv,

многие ко многим. по какому принципу (41,42) и (11,12), а не (11,33) и (41,43)

Неважно либо так либо так, главное чтобы строка участвовала в паре только один раз
21 окт 10, 09:17    [9646208]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
vyv
-2-
vyv,

многие ко многим. по какому принципу (41,42) и (11,12), а не (11,33) и (41,43)

Неважно либо так либо так, главное чтобы строка участвовала в паре только один раз

with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -5     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -1     from dual union all  
select 43,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
select t1.id, max(t2.id)
from tbl t1
inner join tbl t2
on t1.col = t2.col and (t1.qty = (t2.qty*-1))
group by t1.id
21 окт 10, 09:31    [9646267]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
Eras
Member

Откуда: Вильнюс
Сообщений: 123
vyv,

select id
from (select id,
             col,
             qty,
             rn,
             sum(qty) over(partition by col, rn, abs(qty)) af_sum
      from (select id,
                   col,
                   qty,
                   row_number() over(partition by col, qty order by id) rn
            from tbl))
where af_sum = 0
order by id
21 окт 10, 09:34    [9646286]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
Ramin
vyv
-2-
vyv,

многие ко многим. по какому принципу (41,42) и (11,12), а не (11,33) и (41,43)

Неважно либо так либо так, главное чтобы строка участвовала в паре только один раз

with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -5     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -1     from dual union all  
select 43,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
select t1.id, max(t2.id)
from tbl t1
inner join tbl t2
on t1.col = t2.col and (t1.qty = (t2.qty*-1))
group by t1.id

до такого я и сам бы додумался
результат:
...
41 42
42 43
...
42 - участвует в разных парах, неверно
21 окт 10, 09:36    [9646295]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
lice
Guest
select col, min(id), max(id), abs(qty)
  from (select t.*, row_number() over (partition by col, qty order by id) as rn from tbl t)
  group by col, abs(qty), rn
  having count(*) = 2
21 окт 10, 09:40    [9646319]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
lice, Eras
спасибо, есть пара рабочих вариантов
21 окт 10, 09:49    [9646370]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
А если усложнить задачу, ищем не пары а группы, сумма qty в которых =0, строка участвует только в одной группе
with tbl as (
select 11 id, 'c1' col, -1 qty from dual union all 
select 12,    'c1',      1     from dual union all 
select 21,    'c1',      5     from dual union all 
select 22,    'c1',     -2     from dual union all 
select 23,    'c1',     -3     from dual union all 
select 31,    'c1',      1     from dual union all 
select 32,    'c1',     -1     from dual union all 
select 33,    'c1',      1     from dual union all 
select 34,    'c1',      3     from dual union all 
select 41,    'c2',      1     from dual union all 
select 42,    'c2',     -2     from dual union all  
select 43,    'c2',      1     from dual union all  
select 45,    'c2',      1     from dual union all  
select 44,    'c2',     -3     from dual 
)
один из варианов решения: 11,12;21,22,23;31,32,41,42,43
либо:11,12,21,22,23,32,33,41,43,44,45
21 окт 10, 10:13    [9646520]     Ответить | Цитировать Сообщить модератору
 Re: запрос найти пары  [new]
похоже
Guest
vyv, РЮКЗАК??
21 окт 10, 10:51    [9646893]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить