Запрос на получение из очереди по приоритету
Нужно выдать parent_id с максимальным количеством максимально приоритетных записей.максимально приоритетная запись - максимум считается для всех единый, или для каждого parent_id свой?
т.е. что должно выдаться в ситуации:
у parent_id 1 - есть максимальный приоритет 9(10-го нет) и таких записей 3, а у parent_id 2 - есть максимальный приоритет 10 и таких записей 2
Максимум единый, выдастся parent_id = 2
Если данных мало, то просто перебери циклом по priority.
мб что-нить типа (тут на 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
можно вот так попробовать
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
У меня как то так получилось :
правда на ms sql
правда на 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
Оставить комментарий
Anton456
Что-то залип на задаче. Есть таблицаНужно выдать parent_id с максимальным количеством максимально приоритетных записей. Если таких parent_id несколько, то нужно выдать parent_id с максимальными количеством максимально приоритетных записей среди оставшихся.
Инструмент - pl sql
Примеры
Результат parent_id = 1 (так как с макисмальным приоритетом (10) для него 2 записей)
Результат parent_id = 2 (так как с макисмальным приоритетом (10) для него 2 записей, как и у parent_id = 1, но при этом с приоритетом 9 у него 3 записи против 2 у parent_id = 1)