我将每小时结果存储在MySQL数据库表中,其格式为:
ResultId,CreatedDateTime,Keyword,Frequency,PositiveResult,NegativeResult
349,2015-07-17 00:00:00,Homer Simpson,0.0,0.0,0.0
349,2015-07-17 01:00:00,Homer Simpson,3.0,4.0,-2.0
349,2015-07-17 01:00:00,Homer Simpson,1.0,1.0,-1.0
349,2015-07-17 04:00:00,Homer Simpson,1.0,1.0,0.0
349,2015-07-17 05:00:00,Homer Simpson,8.0,3.0,-2.0
349,2015-07-17 05:00:00,Homer Simpson,1.0,0.0,0.0
某小时可能有多个结果,但某些小时内没有结果。
如果我想产生每小时结果的平均值,我可以这样做:
SELECT ItemCreatedDateTime AS 'Created on',
KeywordText AS 'Keyword', ROUND(AVG(KeywordFrequency), 2) AS 'Average frequency',
ROUND(AVG(PositiveResult), 2) AS 'Average positive result',
ROUND(AVG(NegativeResult), 2) AS 'Average negative result'
FROM Results
WHERE ResultsNo = 349 AND CreatedDateTime BETWEEN '2015-07-13 00:00:00' AND '2015-07-19 23:59:00'
GROUP BY KeywordText, CreatedDateTime
ORDER BY KeywordText, CreatedDateTime
但是,结果只包括数据存在的小时数,例如:
349,2015-07-17 01:00:00,Homer Simpson,2.0,2.5,-1.5
349,2015-07-17 04:00:00,Homer Simpson,1.0,1.0,0.0
349,2015-07-17 05:00:00,Homer Simpson,4.5,1.5,-1.0
但我需要显示缺失时间的空白行,例如
349,2015-07-17 01:00:00,Homer Simpson,2.0,2.5,-1.5
349,2015-07-17 02:00:00,Homer Simpson,0.0,0.0,0.0
349,2015-07-17 03:00:00,Homer Simpson,0.0,0.0,0.0
349,2015-07-17 04:00:00,Homer Simpson,1.0,1.0,0.0
349,2015-07-17 05:00:00,Homer Simpson,4.5,1.5,-1.0
如果没有在结果出现之前将空白插入到结果中,我不确定如何继续:我可以使用MySQL来包含空白行吗?
答案 0 :(得分:1)
SQL通常不了解数据,因此您必须自己添加。在这种情况下,您将不得不以某种方式插入未使用的小时。这可以通过插入空行来完成,或者通过计算小时数并调整平均值来完成。
计算小时数并调整平均值:
获取小时数的示例代码:
SELECT COUNT(*) AS number_of_records_with_data,
(TO_SECONDS('2015-07-19 23:59:00')-TO_SECONDS('2015-07-13 00:00:00'))/3600
AS number_of_hours_in_interval
FROM Results
WHERE ResultsNo = 349 AND CreatedDateTime
BETWEEN '2015-07-13 00:00:00' AND '2015-07-19 23:59:00'
GROUP BY KeywordText, CreatedDateTime;
只需将其与其余查询集成即可。
答案 1 :(得分:0)
你不能使用MySQL。无论您以后用什么来处理结果,都必须这样做。迭代你感兴趣的小时/日期范围,以及MySQL返回一些数据的那些数据,我们那些数据。对于其余的,只需添加null / zero值。
与我的stackoverflow同事讨论后,小更新: 而不是你不能我应该写你不应该 - 因为其他用户已经证明有办法做到这一点。但我仍然相信,对于不同的任务,我们应该使用创建的工具,并考虑到这些任务。我的意思是,虽然可能用F-16牵引一辆车,但最好还是叫一辆拖车;)这就是拖车的制造方式。
答案 2 :(得分:0)
虽然您已经接受了答案,但我想演示如何在查询中生成日期时间序列并使用它来解决您的问题。
此查询使用交叉连接和基本算术和日期函数的组合来生成syslog
之间的所有小时数。
即时生成此类数据并不是最好的选择;如果你已经有一个数字为0-31的表,那么所有的联合查询都是不必要的。
请参阅this SQL Fiddle,了解如何使用小数字表格查看。
Sample SQL Fiddle with a demo of the query below
2015-07-16 00:00:00 AND 2015-07-18 23:59:00
答案 3 :(得分:0)
我想出了一个方法,可以在您的MySQL查询的最后一个中添加具有空值的行。
只需运行此查询(在限制中添加所需数量的空行),然后忽略最后一列:
SELECT ItemCreatedDateTime AS 'Created on',
KeywordText AS 'Keyword',
ROUND(AVG(KeywordFrequency), 2) AS 'Average frequency',
ROUND(AVG(PositiveResult), 2) AS 'Average positive result',
ROUND(AVG(NegativeResult), 2) AS 'Average negative result',
null
FROM Results
WHERE ResultsNo = 349 AND CreatedDateTime BETWEEN '2015-07-13 00:00:00' AND
'2015-07-19 23:59:00'
GROUP BY KeywordText, CreatedDateTime
UNION
SELECT * FROM (
SELECT null a, null b, null c, null d, null e,
(@cnt := @cnt + 1) f
FROM (SELECT null FROM Results LIMIT 23) empty1
LEFT JOIN (SELECT * FROM Results LIMIT 23) empty2 ON FALSE
JOIN (SELECT @cnt := 0) empty3
) empty
ORDER BY KeywordText, CreatedDateTime