MySQL每月限制5个

时间:2018-11-13 14:15:00

标签: mysql mysql-workbench

我尝试显示每月工作时间的前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 :(得分:1)

在MySQL 8.0.2及更高版本中,我们可以利用Window Functions。我们可以利用Row_Number()窗口函数来确定年份和月份的关联表达分区中的行号。分区内的排序是根据activity的降序进行的。

然后我们可以将此结果集用作Derived Table,并考虑行号最多为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