2

我在 15 分钟的相同间隔内有一系列测量数据/时间序列。此外,我有一个给定的时间段(例如一天、当前周、月、年、(...),我需要按小时、天、月、(...)汇总值。

例如,按天汇总上个月的所有值。

我的方法是在第一步中生成一个具有每个周期所需间隔的临时数组。例如在 PHP 中(PHP 不是必需的,如果它提供更快的方法,我更喜欢 Python 或 Javascript)

$this->tempArray = array(
'2014-10-01T00:00:00+0100' => array(),
'2014-10-02T00:00:00+0100' => array(),
'2014-10-03T00:00:00+0100' => array(),
'2014-10-04T00:00:00+0100' => array(),
(...)
'2014-10-31T00:00:00+0100' => array()
);

在第二步中,我循环遍历每个日期/值对(在此示例中为 4*24*31,(每天 96 个))并将它们分配给我的临时数组。对于每个日期,我都会覆盖 datetime 对象中的一些值。在此示例中,小时和分钟与临时数组中的键匹配。

$insert = array(
    'datetime' => $datetime,
    'value' => $value
);

if ($interval == "d") {

    $this->tempArray[date('Y-m-d\T00:00:sO', $datetime)][] = $insert;
}

在最后一步,我循环遍历临时数组并汇总每个数组。结果,我收到了一个包含 31 个新日期/值对的数组,按每天汇总。这工作正常。但是,有没有更快或更有效的方法?使用这种方法一个月需要将近 0.5 秒。(如果有人对源代码感兴趣,我会添加一个要点)。数据存储在具有 15 个 mio 条目的 mysql 数据库中。

// 编辑:我认为最好的方法是将它与 mysql 分组。

我当前用于从一年中获取数据的 SQL 查询:

SELECT
FROM_UNIXTIME(PointOfTime)) as `date`,
value
FROM data
WHERE EnergyMeterId="0ca64479-bddf-4b91-9e35-bf81f4bfa84c"
and PointOfTime >= unix_timestamp('2013-01-01T00:00:00')
and PointOfTime <= unix_timestamp('2013-12-31T23:45:00')
order by `date` asc;
4

1 回答 1

2

如果数据位于 MySQL 中,那么我将在其中实施我的解决方案。使用各种 MySQL 日期/时间函数来聚合这些数据是微不足道的。让我们举一个简单的例子,假设这样的表结构:

id:  autoincrement primary key
your_datetime: datetime or timestamp field
the_data: the data items you are trying to summarize

按天(最近一次)汇总的查询如下所示:

SELECT
    DATE(your_datetime) as `day`,
    SUM(the_data) as `data_sum`
FROM table
GROUP BY `day`
ORDER BY `day` DESC

如果您想在一段时间内限制它(例如最近 7 天),您可以简单地添加一个 where 条件

SELECT
    DATE(your_datetime) as `day`,
    SUM(the_data) as `data_sum`
FROM table
WHERE your_datetime > DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY `day`
ORDER BY `day` DESC

这是您指定日期时间范围的另一个示例

SELECT
    DATE(your_datetime) as `day`,
    SUM(the_data) as `data_sum`
FROM table
WHERE your_datetime BETWEEN '2014-08-01 00:00:00' AND '2014-08-31 23:59:59'
GROUP BY `day`
ORDER BY `day` DESC

按小时求和:

SELECT
    DATE(your_datetime) as `day`,
    HOUR(your_datetime) as `hour`
    SUM(the_data) as `data_sum`
FROM table
WHERE your_datetime BETWEEN '2014-08-01 00:00:00' AND '2014-08-31 23:59:59'
GROUP BY `day`, `hour`
ORDER BY `day` DESC, `hour` DESC

按月汇总:

SELECT
    YEAR(your_datetime) as `year`,
    MONTH(your_datetime) as `month`
    SUM(the_data) as `data_sum`
FROM table
GROUP BY `year`, `month`
ORDER BY `year` DESC, `month` DESC

这是对 MySQL 日期/时间函数的参考:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-sub

于 2014-10-07T17:03:01.517 回答