SQLite: вытеснение внутри выборки


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

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

Решение:

drop table if exists prt;

create table prt (
   id integer primary key,
   prj integer,
   part integer,
   val integer
);

insert into prt (prj, part, val) values (1,1,20);
insert into prt (prj, part, val) values (2,2,20);
insert into prt (prj, part, val) values (0,3,10);
insert into prt (prj, part, val) values (0,1,10);
insert into prt (prj, part, val) values (1,4,15);
insert into prt (prj, part, val) values (3,4,20);
insert into prt (prj, part, val) values (2,5,5);
insert into prt (prj, part, val) values (0,6,10);

.mode column
.headers on

select * from prt;

with T as (
    select 
      rank() over (partition by part order by prj desc) as rnk,
      prj,
      part,
      val
    from prt
    order by part
)
select * from T where rnk=1;

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

"partion by part" = каждую долю рассматриваем в рамках отдельной группы
"order by prj desk" = сначала отбираем проектные доли

#