每月5次

bz4sfanl  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(369)

我试着显示每月工作时间的前5名。
我有以下疑问:

  1. SELECT
  2. concat(m.firstname, " ",m.lastname) AS name,
  3. SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) AS activity,
  4. month(start_activity) AS month,
  5. year(start_activity) AS year
  6. FROM
  7. log AS pl
  8. INNER JOIN
  9. employee AS m
  10. ON
  11. m.employee = pl.employee
  12. GROUP BY
  13. name,
  14. year,
  15. month,
  16. ORDER BY
  17. year,
  18. month,
  19. activity

我试过:限制0,5位它只给我所有的前5条记录。如何显示每月订购的5张记录?

6gpjuf90

6gpjuf901#

在mysql 8.0.2及更高版本中,我们可以使用窗口函数。我们可以利用 Row_Number() 窗口函数,用于确定年和月的串联表达式的分区内的行号。分区内的排序是根据 activity .
然后我们可以使用这个结果集作为派生表,并考虑行数最多为5。这将给我们5行每月,有顶部 activity 价值观。

  1. SELECT dt.*
  2. FROM
  3. (
  4. SELECT
  5. concat(m.firstname, " ",m.lastname) AS name,
  6. SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) AS activity,
  7. month(start_activity) AS month,
  8. year(start_activity) AS year,
  9. ROW_NUMBER() OVER (PARTITION BY CONCAT(year(start_activity), month(start_activity))
  10. ORDER BY SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(pl.end_activity,pl.start_activity)))) DESC) AS row_no
  11. FROM
  12. log AS pl
  13. INNER JOIN
  14. employee AS m
  15. ON
  16. m.employee = pl.employee
  17. GROUP BY
  18. name,
  19. year,
  20. month
  21. ) AS dt
  22. WHERE dt.row_no <= 5
  23. ORDER BY
  24. dt.year,
  25. dt.month,
  26. dt.activity
展开查看全部

相关问题