Макс 3 значения каждой группы - PullRequest
0 голосов
/ 29 января 2019

Я отсортировал свои данные примерно так, и теперь я хочу получить топ-3 max person_occurence по каждой компании, но я не мог понять, как это сделать.

   person_occurence company    person_id
    67               company_1  110
    66               company_2  176
    64               company_3  100
    64               company_3  196
    63               company_4  127
    62               company_1  150
    61               company_5  120
    60               company_3  140
    59               company_5  154
    59               company_5  162
    59               company_4  194
    58               company_4  109
    58               company_3  128
    58               company_1  156

Я использовал этот запрос дляполучить максимум в каждой компании, но не может получить топ-3 максимум person_occurence

SELECT max(agent_occurence), company FROM table GROUP BY company;

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Использовать оконные функции:

select t.*
from (select t.*,
             row_number() over (partition by company order by person_occurrence desc) as seqnum
      from t
     ) t
where seqnum <= 3;

Теперь, это предполагает, что вы хотите, чтобы первые 3 были независимо от связей - то есть, если 4 связаны с одним и тем же самым высоким значением, это возвращает три из них.Галстуки усложняют ситуацию.Вы можете хотеть dense_rank() или rank() вместо.

0 голосов
/ 29 января 2019

Вы можете использовать коррелированный подзапрос:

SELECT t1.*
FROM table t1 
WHERE t1.person_occurencee = (SELECT max(t2.person_occurence) FROM table t2 WHERE t1.company = t2.company);

Если ваша СУБД поддерживает аналитическую функцию, вы также можете сделать:

select t.*
from (select t.*,
             rank() over (partition by company order by person_occurrence desc) as seq 
      from t
     ) t
where seq <= 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...