mysql - 按小时汇总行(包括空闲时间)?

标签 mysql sql date grouping interpolation

所以基本上我需要生成一份以过去 48 小时为基础的每小时报告。 对于任何空闲时间,我希望为 total_videostime_in_seconds 返回 0。

但我的尝试似乎没有返回空行,而是得到:

period                   total_videos  time_in_seconds  
Apr 10th 14 00:00-00:59  11            406.00           
Apr 10th 14 02:00-02:59  5             70.00            
Apr 10th 14 03:00-03:59  10            110.00           
Apr 10th 14 06:00-06:59  1             85.40            
Apr 10th 14 07:00-07:59  4             103.00           
Apr 10th 14 08:00-08:59  5             292.44           
Apr 10th 14 12:00-12:59  1             2258.52          
Apr 10th 14 21:00-21:59  5             5189.33          
Apr 10th 14 22:00-22:59  1             182.39           
Apr 10th 14 23:00-23:59  9             119.16           
Apr 11th 14 03:00-03:59  1             2039.13 

这是查询。

#Create a table of all 24 hours
DROP TABLE IF EXISTS hours;
CREATE TEMPORARY TABLE hours (`hour` INT);
INSERT INTO hours (`hour`) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23);

#Create a table that contains todays date, yesterdays date, and the day before (48 hours)
DROP TABLE IF EXISTS dates;
CREATE TEMPORARY TABLE dates (`date` DATE);
INSERT INTO dates(`date`) VALUES (DATE(NOW())), (DATE(NOW() - INTERVAL 24 HOUR)), (DATE(NOW() - INTERVAL 48 HOUR));

SELECT 
DATE_FORMAT(v.`created_at`,'%b %D %y %H:00-%H:59') AS period,
COUNT(v.created_at) AS `total_videos`,
SUM(v.duration) AS `time_in_seconds`
 FROM videos AS v
 RIGHT OUTER JOIN hours AS h ON HOUR(v.`created_at`) = h.hour
 RIGHT OUTER JOIN dates AS d ON DATE(v.`created_at`) = d.date
  WHERE v.created_at IS NULL OR DATE(v.created_at) >= (SYSDATE() - INTERVAL 48 HOUR)
 GROUP BY d.date, h.hour
 ORDER BY d.date, h.hour ASC;

最佳答案

我承认我没有发现你的陈述有什么缺陷。很少会看到外部连接表(在您的情况下是视频)上的条件出现在 where 子句中。当人们这样做时,他们经常忘记那里的外部连接记录。但你没有。您明确检查 null,所以我看不出它有什么问题。

您知道 select 语句会为间隙返回完全空的行,是吗?结果列表中显示的所有值均来自视频。但是,这些空行应该显示出来。奇怪。

您可能想尝试这个语句,它使用更常见的左连接,因此对我们大多数人来说更容易阅读:

SELECT 
  d.date, 
  h.hour,
  DATE_FORMAT(v.created_at,'%b %D %y %H:00-%H:59') AS period,
  COUNT(v.created_at) AS total_videos,
  SUM(v.duration) AS time_in_seconds
FROM hours as h
CROSS JOIN dates d
LEFT JOIN videos AS v ON DATE(v.created_at) = d.date AND HOUR(v.created_at) = h.hour
WHERE v.created_at IS NULL OR 
GROUP BY d.date, h.hour
ORDER BY d.date, h.hour;

出于测试目的,我已将 d.date 和 h.hour 添加到结果列中。这个说法有效吗?

关于mysql - 按小时汇总行(包括空闲时间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003152/

相关文章:

sql - 在 SQL Server 中使用 OPTION(MAXDOP 1) 的目的是什么?

android - 如何在android SQLite中选择两个日期范围之间的数据

mysql - 如何使复合键唯一?

php - 服务器删除和保留输入类型文件的区别

SQL查询从表中获取不存在的记录

javascript - 我可以在 JavaScript 中判断访问者的区域设置是遵循美国风格还是世界其他地区的风格吗?

java - 从 java 运行查询时不使用 oracle 中日期类型列的索引

Mysql查询-分组结果

mysql - SQL中查找数据库中所有表的最大值

python - 通过 MySQL 更新增加的值