SQLite: выборка с приоритетами


Автор: Artix (user.su)

Задача: есть одна и та же доля, переданная эксклюзивно или нет,
возможно разными договорами. Нужно отбирать только единожды 
экслюзивные доли по первому или по последнему договору (приоритет договора).
Не эксклюзивные доли берутся все.

Решение:

drop table if exists prt;

create table prt (
   id integer primary key,
   agree integer,
   part integer,
   excl integer
);

insert into prt (agree, part, excl) values (1,1,1);
insert into prt (agree, part, excl) values (1,2,1);
insert into prt (agree, part, excl) values (2,3,1);
insert into prt (agree, part, excl) values (3,1,1);
insert into prt (agree, part, excl) values (4,4,1);
insert into prt (agree, part, excl) values (4,5,1);
insert into prt (agree, part, excl) values (5,3,0);
insert into prt (agree, part, excl) values (6,3,0);

.mode column
.headers on

select * from prt;

with T as (
  select 
    rank() over (partition by part,excl order by agree desc) as rnk,
    agree,
    part,
    excl
  from prt
  order by agree, part
)
select rnk, agree, part, excl from T where (rnk=1 and excl=1) or (excl=0);

Комментарий:

Выражение "partition by" разбивает набор на группы,
а "order by" - выделяет в каждой группе приоритет договора
(в данном случае - последний договор)

#