Фильтровать дубликаты по результатам row_number - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь сделать запрос на PostgreSQL, который дает мне 10 лучших заданий, которые занимают больше времени каждый месяц (исключая текущий месяц), я сделал этот запрос до сих пор, но он дает мне дубликаты на имя задания , Как я могу отфильтровать их?

SELECT job, month, duration  
FROM (
    SELECT
    month,
    job,
    duration,
    ROW_NUMBER() OVER (PARTITION BY month ORDER BY duration DESC) AS RN
FROM
    run_history
WHERE
    owner = 'john'
    ) x
WHERE RN <= 10
AND month < TO_CHAR(CURRENT_DATE, 'yyyymm')

1 Ответ

0 голосов
/ 29 марта 2020

Звуки , как будто на (owner, month, job) может быть несколько строк, и вы хотите работать с максимальной продолжительностью в месяц для каждого задания.

Если это так, сначала агрегированные вычисления max(duration) , затем используйте row_number() поверх него:

SELECT job, month, max_duration
FROM  (
   SELECT month, job, max(duration) AS max_duration
        , row_number() OVER (PARTITION BY month ORDER BY max(duration) DESC NULLS LAST) AS rn
   FROM   run_history
   WHERE  owner = 'john'
   AND    month < to_char(CURRENT_DATE, 'yyyymm')
   GROUP  BY month, job
   ) sub
WHERE  rn <= 10
ORDER  BY month DESC, rn;

В сторону: рассмотрите integer или date вместо text для столбца month: чище и эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...