Существует два подхода к этому. Один из них - агрегация, а другие - объединения.
select least(origin, dest) as od1, greatest(origin, dest) as od2, sum(passengers) as numpassengers
from path t
group by least(origin, dest), greatest(origin, dest)
order by numpassengers
limit 3;
Другое - это самостоятельное объединение. Если есть только одна строка в каждом направлении, вы можете сделать это без агрегации:
select p1.origin, p1.dest, p1.passengers + p2.passengers as numpassengers
from path p1 join
path pt2
on p1.origin = p2.dest and p1.dest = p2.origin
where p1.origin < p1.dest
order by numpassengers desc
limit 3;
В противном случае, вам нужно самостоятельно присоединиться и агрегации, поэтому первый метод, вероятно, быстрее:
select p1.origin, p1.dest, sum(p1.passengers + p2.passengers) as numpassengers
from path p1 join
path pt2
on p1.origin = p2.dest and p1.dest = p2.origin
where p1.origin < p1.dest
group by p1.origin, p1.dest
order by numpassengers desc
limit 3;
I не знаю, что было бы более эффективным. Тем не менее, я подозреваю, что верхние 3 маршрута по сумме будут, скажем, 100 лучших для каждого направления. Если да, то построить индекс на numpassengers и попробовать:
select least(origin, dest) as od1, greatest(origin, dest) as od2, sum(passengers) as numpassengers
from path t cross join
(select min(passengers) as cutoff
from (select distinct passengers
from path
order by passengers desc
limit 100
) t
) minp
where numpassengers >= minp.cutoff
group by least(origin, dest), greatest(origin, dest)
order by numpassengers
limit 3;
Расчет обрезания должен просто использовать индекс и значительно снизить нагрузку на остальной части запроса.
EDIT:
Если у вас нет least()
и greatest()
, просто использовать case
заявления:
select (case when origin < dest then origin else dest end) as od1,
(case when origin < dest then dest else origin end) as od2,
sum(passengers) as numpassengers
from path t
group by 1, 2
order by numpassengers
limit 3;
Вы можете повторить case
заявления в group by
. Но Amazon Redshift позволяет ссылаться на псевдонимы или позиции столбцов в предложении group by
.
запроса не агрегировать через пассажирское количество столбцов, чтобы обеспечить уникальное происхождение, назначение пару с общим количеством пассажиров. Запрос приводит к дублированию маршрутов с агрегацией, не полностью применяемой в колонке подсчета пассажиров.-- Спасибо за ответ. –
В защиту СебастьянаH я также предполагал, что каждая строка уникальна в каждом направлении. В конце концов, это не наши данные. Я обновил свой ответ, и этот вариант можно изменить так же. –
@AchimSchmitz Спасибо;) И этот ответ точно так же, как я пойду без более глубокого понимания данных. – SebastianH