Получить максимальное значение из двух значений - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть таблица, которая показывает количество поездок наездника в каждой точке стоянки. Мне нужно найти стенд для каждого гонщика, для которого у него есть максимальное количество поездок.

Мой первый результат в этом формате: 1

Мне нужен мой конечный результат, подобный этому: 2

В настоящее время я использую этот запрос, но я знаю, что это можно сделать лучше. Любые предложения будут полезны.

select c.rider_id, c.end_stand, b.max_rides
from
    (select rider_id, max(rides) as max_rides
    from
        (select rider_id, end_stand, count(id) as rides
        from ride where end_stand is not null
        group by 1,2) a
    group by 1
    order by 2 desc, 1) b
join
    (select rider_id, end_stand, count(id) as rides
    from ride where end_stand is not null
    group by 1,2) c
on c.rider_id = b.rider_id and c.rides = b.max_rides
order by 3 desc, 2,1

1 Ответ

1 голос
/ 27 апреля 2019

Перед оконными функциями один метод является коррелированным подзапросом в предложении having:

select rider_id, end_stand, count(*) as rides
from ride r
where end_stand is not null
group by rider_id, end_stand
having count(*) = (select count(*)
                   from ride r2
                   where r2.end_stand is not null and
                         r2.rider_id = r.rider_id
                   group by r2.rider_id, r2.end_stand
                   order by count(*) desc
                   limit 1
                  );

С оконными функциями это, конечно, намного проще:

select *
from (select rider_id, end_stand, count(*) as rides
             rank() over (partition by rider_id order by count(*) desc) as seqnum
      from ride r
      where end_stand is not null
      group by rider_id, end_stand
     ) r
where seqnum = 1;

Оба они вернут дубликаты, если есть связи для макс. Вторую версию легко исправить, если вам нужна только одна строка: используйте row_number() вместо rank().

...