mysql中累积数据的差异

时间:2013-06-03 10:28:28

标签: mysql sql database

我正在拥有以下列的表格在列“值”数据中获取累积数据并在15分钟时间内获取数据间隔

name  | value   | start_time          |end_time            |
------------------------------------------------------------
likes | 5       |2013-05-29 16:30:00  |2013-05-29 17:45:00 |
likes | 6       |2013-05-29 17:00:00  |2013-05-29 17:15:00 |
likes | 6       |2013-05-29 17:30:00  |2013-05-29 17:45:00 |
likes | 10      |2013-05-29 18:00:00  |2013-05-29 18:15:00 |
likes | 10      |2013-05-29 18:30:00  |2013-05-29 18:45:00 |
likes | 11      |2013-05-29 19:00:00  |2013-05-29 19:15:00 |
likes | 11      |2013-05-29 19:30:00  |2013-05-29 19:45:00 |

我想要sql查询每1小时获取一次数据,“value”列中的数据应该是实际数据不累积

例如:

name  | value   | start_time          |end_time            | 
------------------------------------------------------------
likes | 1       |2013-05-29 17:00:00  |2013-05-29 17:59:00 |

OR

name  | value   | start_time          |end_time            | 
------------------------------------------------------------
likes | 1       |2013-05-29 17:00:00  |2013-05-29 17:15:00 |
likes | 0       |2013-05-29 17:30:00  |2013-05-29 17:45:00 |

我希望“值”列数据作为该期间的实际数据而不是累积数据

1 个答案:

答案 0 :(得分:0)

create table my_test ( `name` char(5), `value` int,  `start_time` datetime, `end_time` datetime);

我已经更正了第一次结束时间因为我认为这是一个错字(2013-05-29 17:45:00到2013-05-29 17:00:00):

insert into my_test values
('likes', 5 ,      '2013-05-29 16:30:00',  '2013-05-29 17:00:00'),
('likes', 6 ,      '2013-05-29 17:00:00',  '2013-05-29 17:15:00'),
('likes', 6 ,      '2013-05-29 17:30:00',  '2013-05-29 17:45:00'),
('likes', 10,      '2013-05-29 18:00:00',  '2013-05-29 18:15:00'),
('likes', 10,      '2013-05-29 18:30:00',  '2013-05-29 18:45:00'),
('likes', 11,      '2013-05-29 19:00:00',  '2013-05-29 19:15:00'),
('likes', 11,      '2013-05-29 19:30:00',  '2013-05-29 19:45:00');

我有一个快速查询,我认为这样做是正确的,但时间边界有点偏。

select 'likes' `name`, l2 - l1 `value`, `start`.`start_time` `start_time`,  `end`.`end_time` `end_time`   from
    (
        select date_format(start_time, '%Y-%m-%d %H:00:00') start_time, max(value) l1 from my_test group by date_format(start_time, '%Y%m%d%H')
    ) as `start` join 
    (
        select date_format(start_time, '%Y-%m-%d %H:00:00') end_time, max(value) l2 from my_test group by date_format(start_time, '%Y%m%d%H')
    ) as `end` on `start`.start_time + interval 1 hour = `end`.end_time;

结果如下:

name  | value  | start_time          |end_time              |
------------------------------------------------------------- 
likes | 1      | 2013-05-29 16:00:00 |  2013-05-29 17:00:00 |
likes | 4      | 2013-05-29 17:00:00 |  2013-05-29 18:00:00 |
likes | 1      | 2013-05-29 18:00:00 |  2013-05-29 19:00:00 |