2017-07-11 15 views
0

我有一个查询,看起来像这样:查找小时,日,周和月1小时时间戳和群体之间的差距 - MySQL的

SELECT count(*), date_format(created, '%H:%i - %d/%m/%y') as 
datecreated 
FROM mimesi_realtime.served_clips 
where created > NOW() - INTERVAL 48 HOUR 
group by date_format(created, '%H - %d/%m/%y') 
order by min(created) ASC; 

,它基本上是一个计数每隔一小时,在过去48小时,它排序按时间顺序结果

的问题是,在夜间,特别是22:00和5:00之间没有数据被注册,我需要显示0计数为每小时反正

count(*) is in左栏
创建是正确的

一)实际结果:

- 261, 20:00 - 11/04/17 
- 133, 21:00 - 11/04/17 
- 208, 22:00 - 11/04/17 
- 358, 5:00 - 12/04/17 
- 489, 6:00 - 12/04/17 

B)预期的结果:

- 261, 20:00 - 11/04/17 
- 133, 21:00 - 11/04/17 
- 208, 22:00 - 11/04/17 
- 0, 23:00 - 11/04/17 
- 0, 24:00 - 11/04/17 
- 0, 1:00 - 12/04/17 
- 0, 2:00 - 12/04/17 
- 0, 3:00 - 12/04/17 
- 0, 4:00 - 12/04/17 
- 358, 5:00 - 12/04/17 
- 489, 6:00 - 12/04/17 

是否有关于我怎么能做到这一点任何方式?

+0

如果你选择了一些东西,那么通常你必须按同样的东西来分组。如需进一步的帮助,请参阅https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple -sql-query – Strawberry

+0

昨天我们解决了这个问题,不是吗? https://stackoverflow.com/questions/45011431/find-missing-date-and-add-them-into-result-mysql –

+0

@EstebanP。我们只做了几天和几个月。但我试图做几个小时和几周,但它不起作用 – GPecchio

回答

1

对于您的问题通常的解决方案是创建一个日历表包含您想要在您的报告中显示的所有时间戳。如果你不能创建表格,那么你可以使用内联方法,例如

(
    SELECT '2017-11-07 00:00:00' AS ts UNION ALL 
    SELECT '2017-11-07 01:00:00'  UNION ALL 
    ... 
    SELECT '2017-11-07 23:00:00' 
) t 

然后左加入日历表当前表,做一个类似的查询:

SELECT 
    COUNT(t2.created), 
    DATE_FORMAT(t1.ts, '%H - %d/%m/%y') AS datecreated 
FROM calendar t1 -- possibly replace with inline table 
LEFT JOIN mimesi_realtime.served_clips t2 
    ON DATE_FORMAT(t1.ts, '%H - %d/%m/%y') = DATE_FORMAT(t2.created, '%H - %d/%m/%y') 
WHERE t1.ts > NOW() - INTERVAL 48 HOUR 
GROUP BY DATE_FORMAT(t1.ts, '%H - %d/%m/%y') 
ORDER BY MIN(t1.ts) 

如果你不想用日历表工作,那么另一个选择是有计划过程每小时写一个虚拟记录。这将保证每个时间点都出现在您的表格中。它有一些浪费空间的缺点以及设置它的时间。

+0

是的,我想过,但问题是,我不能修改数据库,但我只能运行查询 – GPecchio

+0

@GPecchio没有问题。您可以使用内联日历表,然后您的代码将在感兴趣的时段生成该表。 –

+0

内联表可以是动态的,因为我需要过去48小时的数据? – GPecchio

相关问题