给定一个带有时间戳列的表,例如:

    timestamp           |  id  |  value
    --------------------------------------
    2001-01-01 00:00:00 |  1   |  3
    2001-01-01 00:00:00 |  2   |  5
    --------------------------------------
    2001-01-02 00:00:00 |  1   |  6
    2001-01-02 00:00:00 |  2   |  10
    2001-01-02 00:00:00 |  3   |  7
    --------------------------------------
    2001-01-03 00:00:00 |  3   |  14
    2001-01-03 00:00:00 |  2   |  15
    --------------------------------------
    2001-01-03 00:00:00 |  1   |  9
    2001-01-03 00:00:00 |  2   |  20

在给定的聚合水平下,比如说2天,我想将结果聚合(求和)到:
(1)给定agg水平的移动窗口,例如:2001-01-01至2001-01-02、2001-01-02至2001-01-03、2001-01-03至2001-01-04,将导致:
    timestamp_1         | timestamp_2         |  id  |  agg_value
    -----------------------------------------------------------
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  1   |  9 (=3+6)
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  2   |  15 (=5+10)
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  3   |  7 (=7)
    -----------------------------------------------------------
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 |  1   |  6 (=6)
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 |  2   |  25 (=10+15)
    2001-01-02 00:00:00 | 2001-01-03 00:00:00 |  3   |  21 (=7+14)
    -----------------------------------------------------------
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  1   |  9 (=9)
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  2   |  35 (=15+20)
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  3   |  14 (=14)

(2)对给定范围的非重叠划分,例如:2001-01-01至2001-01-02、2001-01-03至2001-01-04,这将导致:
    timestamp_1         | timestamp_2         |  id  |  agg_value
    -----------------------------------------------------------

    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  1   |  9 (=3+6)
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  2   |  15 (=5+10)
    2001-01-01 00:00:00 | 2001-01-02 00:00:00 |  3   |  7 (=7)
    -----------------------------------------------------------
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  1   |  9 (=9)
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  2   |  35 (=15+20)
    2001-01-03 00:00:00 | 2001-01-04 00:00:00 |  3   |  14 (=14)

(基本上类似于(1)没有重叠)
谢谢!
编辑:添加解决方案
我至少有一个解决方案(1):
    SELECT t1.timestamp AS timestamp1,
    MAX(t2.timestamp) AS timestamp2, t1.id,
    SUM(t2.value) AS agg_value
    FROM my_table t1
    LEFT JOIN my_table t2 ON
    (t2.timestamp >= t1.timestamp AND
    t2.timestamp <= ADDDATE(t1.timestamp,INTERVAL 2 DAY) AND
    t2.id = t1.id)
    GROUP BY t1.timestamp, t1.id

(2)的解决方案可能只是过滤到上面的一个子集。

最佳答案

这将通过获取日期部分并获取日期差异,再根据日期差异和ID进行分组,每X天进行一次分组。这将得到您的#2解决方案

select
       CEILING( datediff( date( now() ), date( myTimeStamp )) / 2 ) DaysDiff,
       ID,
       min( date( myTimeStamp )) as FirstDateInGroup,
       max( date( myTimeStamp )) as LastDateInGroup,
       sum( value ) as SumVal
   FROM TimeSample
   group by DaysDiff, ID
   order by FirstDateInGroup, ID

编辑——根据评论
你的样本显示了两天的处理方法。。。这也是。“now()”只是分组数据的基线。如果你想按年份细分,那么我只需要根据年份(YourDateColumn)作为组进行查询。如果你想要30天,只要除以30。每月,我会分别按年份(YourDateColumn)和月份(YourDateColumn)分组。通过有一个固定的“now()”范围,它只返回一个数字作为起点。如果你的数据是2年前的,那么日期差就是365天*2年=730天。。。除以2,你的背部以365为单位。你可以抛出任何你想进一步限制你感兴趣的时间段的where子句。。。
其中,我的时间戳介于“2011-01-01”和“2011-06-30”之间,只得到今年的前6个月。。。这将导致您的DaysDiff分组为208天/2=104。
所以,如果你有其他的基线值,你可以把now()改成类似'2011-01-01'的值,它将基于2011年1月1日的基础进行计算。其中,只需将DaysDiff计算为负值,直到0,然后再返回正值。

关于mysql - MySQL如何在一定范围的时间戳上求和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6836841/

10-12 20:00