mysql - 按名称、时间和 sum_average 对时间段进行分组

标签 mysql sql

我有一个名为 Periods 的表,我需要使用其数据创建以下结构。

{
  name: place_type
  data: [[hour], avg(attendance)]
}

平均=出勤总和/课时数

例子:

{
  name: "Swimming Room", 
  data: [["06:00", 10], ["07:00", 16], ["08:00", 28]]
}

基本上,我需要对 place_type、小时数和平均出勤率进行分组。

我写了这个查询,但我不知道如何计算平均值

SELECT 
    SUM(`periods`.`attendance`)/COUNT(*) AS sum_attendance,
    place_types.name AS place_types_name,
    LPAD(HOUR(`periods`.`start_at`), 2, 0) AS rounded_hour

    FROM `periods` LEFT OUTER JOIN `place_types` 
        ON `place_types`.`id` = `periods`.`place_type_id` 
        WHERE `periods`.`location_id` = 131 
            AND (`periods`.`start_at` BETWEEN '2017-06-29 06:00:00' AND '2017-06-29 23:00:00')
        GROUP BY place_types.name, rounded_hour

当前结果

sum_attendance  place_types_name    rounded_hour
1762            swim                14
1587            box                 14

预期的结果是

sum_attendance  place_types_name    rounded_hour
avg         swim                0
avg         swim                1
avg         swim                2
avg         swim                3
avg         swim                4
avg         swim                5
avg         swim                6
avg         swim                7

...................... 平均游泳 23

avg         box                 1
........
avg         box                 23

更新 1

在除法器中添加 COUNT(*) 计算正确的平均值

SUM(`periods`.`attendance`)/COUNT(*) AS average_attendance

它产生以下结果:

sum_attendance  place_types_name    rounded_hour
160.1818        cardio              14
158.7000        esteira             14
149.8000        shape               14

但它仍然不会计算到每个单独的小时。

最佳答案

periods 中有数据时,此查询应该可以获取每小时的平均值:

SELECT AVG(p.`attendance`) AS sum_attendance,
       pt.name AS place_types_name,
       LPAD(HOUR(p.`start_at`), 2, 0) AS rounded_hour
FROM `periods` p LEFT OUTER JOIN
     `place_types` pt
      ON pt.`id` = p.`place_type_id` 
WHERE p.`location_id` = 131 AND
      p`.`start_at` BETWEEN '2017-06-29 06:00:00' AND '2017-06-29 23:00:00'
GROUP BY pt.name, rounded_hour;

如果您没有数据,则小时将不会显示在结果集中。

关于mysql - 按名称、时间和 sum_average 对时间段进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45197398/

相关文章:

mysql - mysql POINT 坐标的导出/导入问题

mysql - 返回 3 个表中常见记录与唯一记录的相加

MySQL Workbench 不显示表之间的正确关系

mysql - 触发器从第二个 MySQL 表中删除

php - 获取插入到特定ID的sql中的最新行

php - 如何在 php 中的同一页面上显示错误消息

mysql - Asterisk res_config_mysql 模块丢失

sql - 在触发器函数中,如何获取正在更新的字段

c# - SqlBulkCopy 无法将值 NULL 插入到列中

sql - 优化一个麻烦的查询