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

Откуда:
Сообщений: 111
Есть таблица Payments с полями id_p, sender, operation. Необходимо вывести все sender которые повторяются в таблице, но при этом id_p разные.
Я пробовал писать так:
with Payments (id_p, sender, operation) as
(
select 23,  'AA', 34  from dual union all
select 24,  'AA', 45  from dual union all
select 56,  'HH', 14  from dual union all
select 56,  'HH', 15  from dual union all
select 27,  'KK', 17  from dual union all
select 88,  'NN', 17  from dual union all
select 17,  'WW', 14  from dual union all
select 19,  'WW', 10  from dual union all
select 10,  'WW', 17  from dual union all
select 29,  'EE', 17  from dual union all
--select 29,  'EE', 17  from dual union all
select 30,  'EE', 17  from dual
),
 tt AS(
select   p.*
	,count(sender) over (partition by id_p) 	AS Id_part
	,count(sender) over (partition by sender)	AS Sender_part
from Payments P
)
select id_p, sender, operation
from tt
where Sender_part != 1 
  and Id_part = 1

Результат запроса, тот который нужен, но до тех пор пока я не добавил строку
select 29,  'EE', 17  from dual union all

в итоге я хотел бы что бы для sender = EE были следующие данные:
id_p sender operation
29 'EE' 17
30 'EE' 17

помогите пожалуйста
31 окт 13, 14:55    [15059027]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1312
MaxiMaxiM,

distinct?
31 окт 13, 15:11    [15059107]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
MaxiMaxiM,
или как вариант
select distinct id_p, sender, operation
  from (select p.*, count(1) over(partition by sender, operation) cnt,
                    count(1) over(partition by id_p, sender, operation order by rownum rows between unbounded preceding and unbounded following) dst
          from payments p)
 where cnt > 1 and (cnt != dst or dst = 1)
31 окт 13, 15:16    [15059146]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
вернее

select id_p, sender, operation
  from (select p.*, count(1) over(partition by sender, operation) cnt,
                    count(1) over(partition by id_p, sender, operation) dst,
                    row_number() over (partition by id_p, sender, operation order by rownum) rn
          from payments p)
 where cnt > 1 and cnt != dst and rn = 1
31 окт 13, 15:41    [15059291]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
stax..
Guest
MaxiMaxiM
Есть таблица Payments с полями id_p, sender, operation. Необходимо вывести все sender которые повторяются в таблице, но при этом id_p разные.

id_p разные в разрезе sender?

.....
stax
31 окт 13, 16:13    [15059525]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
stax..,

да
31 окт 13, 16:44    [15059786]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
ILoveCoffee,
запрос выдает данные только для sender = EE а для sender = AA и WW данные пропали
31 окт 13, 16:48    [15059832]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
разве что union сделать
31 окт 13, 16:56    [15059916]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
Древний инстинкт
Guest
15059107
where Sender_part != 1
и не мучь Ж
31 окт 13, 17:01    [15059965]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
ILoveCoffee,
если так
select id_p, sender, operation
  from (select p.*, count(1) over(partition by sender) cnt,
                    count(1) over(partition by id_p, sender) dst,
                    row_number() over (partition by id_p, sender order by rownum) rn
          from payments p)
 where cnt > 1 and cnt != dst and rn = 1

то все работает
31 окт 13, 17:18    [15060094]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
Zeratulnn
Member

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

SELECT DISTINCT id_p, sender, operation FROM(
  SELECT 
    id_p, sender, operation, COUNT(*) OVER(PARTITION BY sender) AS ct, COUNT(*) OVER(PARTITION BY id_p, sender) AS ctr
    from Payments)
     WHERE ct >1 AND ct<>ctr
  ORDER BY 2
31 окт 13, 17:25    [15060130]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
stax..
Guest
MaxiMaxiM,
что на виходе для
with Payments (id_p, sender, operation) as
(
select 23,  'AA', 34  from dual union all
select 24,  'AA', 45  from dual union all
select 56,  'HH', 14  from dual union all
select 56,  'HH', 15  from dual union all
select 56,  'HH', 15  from dual union all
select 27,  'KK', 17  from dual union all
select 88,  'NN', 17  from dual union all
select 17,  'WW', 14  from dual union all
select 19,  'WW', 10  from dual union all
select 10,  'WW', 17  from dual union all
select 19,  'ZZ', 10  from dual union all
select 29,  'EE', 16  from dual union all
select 29,  'EE', 17  from dual union all
select 29,  'EE', 17  from dual union all
select 30,  'EE', 17  from dual
)
select * from Payments
order by 1,2,3
/
      ID_P SE  OPERATION
---------- -- ----------
        10 WW         17
        17 WW         14
        19 WW         10
        19 ZZ         10
        23 AA         34
        24 AA         45
        27 KK         17
        29 EE         16
        29 EE         17
        29 EE         17
        30 EE         17
        56 HH         14
        56 HH         15
        56 HH         15
        88 NN         17

15 rows selected.


.......
stax
31 окт 13, 17:33    [15060171]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
stax..,
данные для ZZ не должны отображаться, а для ЕЕ
29 EE 17
30 EE 17

а поле вообще никакой роли не играет
31 окт 13, 17:43    [15060232]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

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

спасибо, так тоже работает
31 окт 13, 17:44    [15060237]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
Zeratulnn
Member

Откуда:
Сообщений: 85
MaxiMaxiM,
А если так
with Payments (id_p, sender, operation) as
(
select 23,  'AA', 34  from dual union all
select 24,  'AA', 45  from dual union all
select 56,  'HH', 14  from dual union all
select 56,  'HH', 15  from dual union all
select 56,  'HH', 15  from dual union all
select 27,  'KK', 17  from dual union all
select 88,  'NN', 17  from dual union all
select 17,  'WW', 14  from dual union all
select 19,  'WW', 10  from dual union all
select 10,  'WW', 17  from dual union all
select 19,  'ZZ', 10  from dual union all
select 29,  'EE', 16  from dual union all
select 29,  'EE', 16  from dual union all
select 29,  'EE', 17  from dual union all
select 29,  'EE', 17  from dual union all
select 30,  'EE', 17  from dual
)


Что должно выдать?
Непонятно почему откинуто значение 29, 'EE', 16 . То ли из-за того, что оно 1 раз встретилось, то ли вы просто в контексте
id_p, sender возвращаете max(operation)
31 окт 13, 17:51    [15060275]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
MaxiMaxiM
Member

Откуда:
Сообщений: 111
Zeratulnn,
23 'AA' 34
24 'AA' 45
17 'WW' 14
19 'WW' 10
10 'WW' 17
29 'EE' 17
30 'EE' 17

важно выбрать только всех sender, которые встречаются более 2 раз и с разными id_p, а operation произвольно
31 окт 13, 18:03    [15060343]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
Zeratulnn
Member

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

Тогда так, а в моём предыдущемпосте ошибка
SELECT id_p, sender, operation FROM(
  SELECT 
    id_p, sender, MAX(operation) AS operation, COUNT(*) OVER(PARTITION BY sender) AS ct, COUNT(*) OVER(PARTITION BY id_p, sender) AS ctr
    from Payments
    GROUP BY id_p, sender)
     WHERE ct >1 AND ct<>ctr
  ORDER BY 2
31 окт 13, 18:11    [15060395]     Ответить | Цитировать Сообщить модератору
 Re: Выбор данных  [new]
stax..
Guest
MaxiMaxiM
Zeratulnn,
23 'AA' 34
24 'AA' 45
17 'WW' 14
19 'WW' 10
10 'WW' 17
29 'EE' 17
30 'EE' 17

важно выбрать только всех sender, которые встречаются более 2 раз и с разными id_p, а operation произвольно

with Payments (id_p, sender, operation) as
(
select 23,  'AA', 34  from dual union all
select 24,  'AA', 45  from dual union all
select 56,  'HH', 14  from dual union all
select 56,  'HH', 15  from dual union all
select 56,  'HH', 15  from dual union all
select 27,  'KK', 17  from dual union all
select 88,  'NN', 17  from dual union all
select 17,  'WW', 14  from dual union all
select 19,  'WW', 10  from dual union all
select 10,  'WW', 17  from dual union all
select 19,  'ZZ', 10  from dual union all
select 29,  'EE', 16  from dual union all
select 29,  'EE', 16  from dual union all
select 29,  'EE', 17  from dual union all
select 29,  'EE', 17  from dual union all
select 30,  'EE', 17  from dual
)
select * from (
 select
    p.*
   --,count(1) over (partition by sender) cs
   ,count(distinct id_p) over (partition by sender) c_id
   ,row_number() over (partition by sender,id_p order by operation) rw
 from  Payments p
 )
where
  --cs>1 and
  c_id>1 and rw=1
/
SQL> /

      ID_P SE  OPERATION       C_ID         RW
---------- -- ---------- ---------- ----------
        23 AA         34          2          1
        24 AA         45          2          1
        29 EE         16          2          1
        30 EE         17          2          1
        10 WW         17          3          1
        17 WW         14          3          1
        19 WW         10          3          1

7 rows selected.


.....
stax
1 ноя 13, 10:52    [15062926]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить