Запрос на получение из очереди по приоритету

Anton456

Что-то залип на задаче. Есть таблица





priority parent_id


Нужно выдать parent_id с максимальным количеством максимально приоритетных записей. Если таких parent_id несколько, то нужно выдать parent_id с максимальными количеством максимально приоритетных записей среди оставшихся.
Инструмент - pl sql
Примеры



































priority parent_id
10 1
10 1
9 1
9 1
8 1
8 1
10 2
9 2
9 2
9 2


Результат parent_id = 1 (так как с макисмальным приоритетом (10) для него 2 записей)






































priority parent_id
10 1
10 1
9 1
9 1
8 1
8 1
10 2
10 2
9 2
9 2
9 2


Результат parent_id = 2 (так как с макисмальным приоритетом (10) для него 2 записей, как и у parent_id = 1, но при этом с приоритетом 9 у него 3 записи против 2 у parent_id = 1)

Dasar

Нужно выдать parent_id с максимальным количеством максимально приоритетных записей.
максимально приоритетная запись - максимум считается для всех единый, или для каждого parent_id свой?
т.е. что должно выдаться в ситуации:
у parent_id 1 - есть максимальный приоритет 9(10-го нет) и таких записей 3, а у parent_id 2 - есть максимальный приоритет 10 и таких записей 2

Anton456

Максимум единый, выдастся parent_id = 2

mbolik1

Если данных мало, то просто перебери циклом по priority.

zya369

мб что-нить типа (тут на 3 приоритета всего, но очевидно на любое заведоно конечное множество можно)
  
select parent_id, sum(if(prio = 10, 1, 0 sum(if(prio = 9, 1, 0 sum(if(prio = 8, 1, 0 from table group by parent_id order by 2,3,4

filcom09

можно вот так попробовать
  
with t as (
select 10 prio, 1 parent from dual union all
select 10 prio, 1 parent from dual union all
select 9 prio, 1 parent from dual union all
select 9 prio, 1 parent from dual union all
select 8 prio, 1 parent from dual union all
select 8 prio, 1 parent from dual union all
select 10 prio, 2 parent from dual union all
--select 10 prio, 2 parent from dual union all
select 9 prio, 2 parent from dual union all
select 9 prio, 2 parent from dual union all
select 9 prio, 2 parent from dual
)
select distinct first_value(parent) over(order by sign(cnt2-1) desc, prio desc, cnt desc) par
from (
select t2.*, count(distinct cnt) over(partition by prio) cnt2
from (
select prio, parent, count(*) cnt
from t
group by prio, parent
) t2
) t3

Alena_08_11

У меня как то так получилось :
правда на ms sql

declare @tbl table (Prio int, ParentID int)

insert into @tbl (Prio
, ParentID)
--select
-- 10
-- , 1 union all
--select
-- 10
-- , 1 union all
--select
-- 9
-- , 1 union all
--select
-- 9
-- , 1 union all
--select
-- 8
-- , 1 union all
--select
-- 8
-- , 1 union all
--select
-- 10
-- , 2 union all
--select
-- 9
-- , 2 union all
--select
-- 9
-- , 2 union all
--select
-- 9
-- , 2

select 10,1 union all
select 10,1 union all
select 9,1 union all
select 9,1 union all
select 8,1 union all
select 8,1 union all
select 10,2 union all
select 10,2 union all
select 9,2 union all
select 9,2 union all
select 9,2



------------------------

;with cte as (
select
t.ParentID
, t.Prio
, cnt = count(*)
from
@tbl t
group by
t.ParentID
, t.Prio)
select top 1
t1.ParentID
from
cte t1
left join cte t2
on t1.ParentID <> t2.ParentID and t1.Prio = t2.Prio and t1.cnt = t2.cnt
where
t2.ParentID is null
order by
t1.Prio desc
, t1.cnt desc


Оставить комментарий
Имя или ник:
Комментарий: