MySQL лимит 5 в месяц - PullRequest
       7

MySQL лимит 5 в месяц

0 голосов
/ 13 ноября 2018

Я пытаюсь показать 'топ-5' за месяц отработанных часов.

У меня есть следующий запрос:

SELECT
    concat(m.firstname, " ",m.lastname) AS name,
    SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) AS activity,
    month(start_activity) AS month,
    year(start_activity) AS year
FROM 
    log AS pl
INNER JOIN
    employee AS m
ON
    m.employee = pl.employee
GROUP BY
    name,
    year,
    month,
ORDER BY
    year,
    month,
    activity

Я пытался: ограничение 0,5 бит, это дает мневсего 5 первых записей.Как я могу показать 5 записей, упорядоченных по месяцам?

1 Ответ

0 голосов
/ 13 ноября 2018

В MySQL версии 8.0.2 и выше мы можем использовать Window Window * . Мы можем использовать оконную функцию Row_Number() для определения номеров строк в пределах раздела каскадного выражения года и месяца . Упорядочение внутри раздела выполняется в порядке убывания activity.

Затем мы можем использовать этот набор результатов в качестве Производной таблицы и считать номер строки до 5. Это даст нам 5 строк в месяц, имеющих максимальные значения activity.

SELECT dt.* 
FROM 
(
  SELECT
    concat(m.firstname, " ",m.lastname) AS name,
    SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) AS activity,
    month(start_activity) AS month,
    year(start_activity) AS year, 
    ROW_NUMBER() OVER (PARTITION BY CONCAT(year(start_activity), month(start_activity))
                       ORDER BY SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) DESC) AS row_no 
  FROM 
    log AS pl
  INNER JOIN
    employee AS m
  ON
    m.employee = pl.employee
  GROUP BY
    name,
    year,
    month
) AS dt 
WHERE dt.row_no <= 5
ORDER BY
    dt.year,
    dt.month,
    dt.activity
...