我正在拥有以下列的表格在列“值”数据中获取累积数据并在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 |
我希望“值”列数据作为该期间的实际数据而不是累积数据
答案 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 |