Автор: 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" - выделяет в каждой группе приоритет договора
(в данном случае - последний договор)
#
SQL Справочник v0.05 © 2007-2025 Igor Salnikov aka SunDoctor