用于每天,每小时收集数据的SQL语句

时间:2008-12-15 22:25:30

标签: sql

我有一个数据库,每天更新200-1000个新行。现在,我希望有一个SQL语句,每小时,每小时返回数据,因此我可以粗略估计当前趋势,即今天将向数据库添加多少行,只需快速浏览一下这些历史图表。

所以,说我想在过去10天内打印10张图表,每小时总结一次数据,如:

第9天:21,24,15,18,...,30,28,25:总计348(第9天每小时的行数和总数) 第8天:32,37,38,43,...,45,55,65:总计442(第8天每小时的行数和总数) ... ... Day0:18,25,28,X,Y ......:tot'S'(到目前为止今天的统计数据.S会是什么?)

SQL语句如何以每天一小时的方式收集数据?

为了对今天的总“S”进行粗略估计,不是直观地观察景观,而是更好地计算“S”的预测。但是,我认为这将是一个完全不同的问题...如何做到这一点或提示我可以获得更多信息的任何提示将非常感激!

谢谢, /托米

3 个答案:

答案 0 :(得分:7)

嗯,根据你的数据库引擎,你会得到不同的结果,但是对于PostgreSQL,我会做那样的事情:

SELECT date_trunc('hour', table.date), count(table.id)
FROM table
GROUP BY date_trunc('hour', table.date)
ORDER BY date_trunc('hour', table.date)

date_trunc函数将时间戳字段截断到某个点。该查询会每小时返回一次,查询次数,您只需要在软件中进行总结。

如果你真的想让一个SQL查询返回你想要的东西,我认为你必须使一个函数返回一个带有正确数据的sql集,但我认为在你的代码中更容易。 / p>

答案 1 :(得分:2)

MySQL有一堆日期/时间函数......你可能在PostGreSQL中寻找HOUR(date)等同于date_trunc('hour',date)。

所以,如果你想按天和小时......

SELECT Day(theDate), Hour(theDate), COUNT(1)
FROM theTable
WHERE ....
GROUP BY Day(theDate), Hour(theHour)
ORDER BY Day(theDate), Hour(theHour)

它会给你这样的行:

Day,Hour,Count
1,0,102
1,1,133
...
10,22,47
10,23,384

答案 2 :(得分:1)

我有类似的情况,使用Oracle。使用名为 reporting_data 的表格,我想要一个查询,告诉我每小时插入了多少条记录,以及以10分钟为单位插入了多少条记录。

每小时很容易:

    SELECT TO_CHAR(TRUNC(r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS'),
         COUNT (*)
    FROM reporting_data r
   WHERE r.creation_date > TO_DATE ('27-OCT-2008', 'dd - mon - yyyy')
     AND r.creation_date < TO_DATE ('28-OCT-2008', 'dd - mon - yyyy')
GROUP BY TO_CHAR (TRUNC (r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS')
ORDER BY TO_CHAR (TRUNC (r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS') ASC

根据 creation_date 列,该查询将返回10月27日至10月28日期间每小时细分的所有记录的计数。

以10分钟的增量而不是每小时的增量来分解它有点困难,但是通过一些操作它是可行的。

SELECT   SUBSTR(TO_CHAR(r.creation_date, 'DD-MON-YYYY HH24:MI:SS'), 1, 16) || '0:00',
         COUNT (*)
    FROM reporting_data r
   WHERE r.creation_date > TO_DATE ('27-OCT-2008', 'DD-MON-YYYY')
     AND r.creation_date < TO_DATE ('28-OCT-2008', 'DD-MON-YYYY')
GROUP BY SUBSTR (TO_CHAR (r.creation_date, 'DD-MON-YYYY HH24:MI:SS'), 1, 16) || '0:00'

那里有很多字符串操作,所以它可能不是最有效的方法。在超过25,000,000行的表上,执行大约需要一分钟。 (然后,在同一个表上执行SELECT COUNT(*)也需要大约30秒,所以除了查询之外可能还有其他问题。)