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