Вы должны использовать только SQL, чтобы решить эту проблему .. если вам действительно нужно это в PL/SQL, просто врезать этот запрос в пределах PLSQL ..
(установка)
drop table yourtable;
create table yourtable (
userID number,
prod varchar2(10)
)
/
insert into yourtable values (123544, 'cars');
insert into yourtable values (123544, 'cars');
insert into yourtable values (123544, 'dogs');
insert into yourtable values (123544, 'cats');
insert into yourtable values (987689, 'bats');
insert into yourtable values (987689, 'cats');
commit;
- - если связи не нарушены, эта логика возвращает как связи
with w_grp as (
select userID, prod, count(*) over (partition by userID, prod) rgrp
from yourtable
),
w_rnk as (
select userID, prod, rgrp,
rank() over (partition by userID order by rgrp desc) rnk,
from w_grp
)
select distinct userID, prod
from w_rnk
where rnk = 1
/
USERID PROD
---------- ----------
987689 bats
987689 cats
123544 cars
- при условии, что вам просто нужно 1 .. это вернет 1 случайное, если они связаны. (т.е. на этот раз он вытащил 987689 летучих мышей, в следующий раз он может тянуть 987689 кошек. Он всегда будет возвращать 123544 автомобили, однако, так как нет галстука для того.
with w_grp as (
select userID, prod, count(*) over (partition by userID, prod) rgrp
from yourtable
),
w_rnk as (
select userID, prod, rgrp,
row_number() over (partition by userID order by rgrp desc) rnum
from w_grp
)
select userID, prod, rnum
from w_rnk
where rnum = 1
/
USERID PROD RNUM
---------- ---------- ----------
123544 cars 1
987689 bats 1
[править] Подчищены неиспользуемый разряд/row_number от функций, чтобы избежать путаницы [/ редактировать]
Это обязательный plsql? может быть sql? – Aramillo
Как вы можете обращаться с галсами? Например: в ваших данных образца, Userid 987689 .. вы хотите летучих мышей или кошек? оба они наиболее встречаются (т.е. один раз). – Ditto
Почему, по-вашему, вам нужна хранимая процедура? –