我有一个表 traffic_data 里面有字段date_time(DATETIME类型)、speed(int类型),里面是每2分钟一条数据,现在想以分钟(4分钟、8分钟、50分钟等等,只要是60以内的偶数分钟都有可能)来进行统计speed。
表结构:
date_time                  speed
2011-06-23 20:10:00           1
2011-06-23 20:12:00           2
2011-06-23 20:14:00           3
2011-06-23 20:14:00           1
2011-06-23 20:14:00           2
2011-06-23 20:16:00           2(特别说明:date_time可能有重复的)如:按4分钟统计,等于大于2011-06-23 20:10:00小于2011-06-23 20:14:00这段时间内speed为3。时间显示为2011-06-23 20:14:00结果:
date_time                  speed
2011-06-23 20:14:00           3
2011-06-23 20:18:00           8
.........                     ....
--------------------------------------------------------------------
另外,我用的是MySql数据库,网上说的一些方法函数MySql貌似不支持,没做出来。本人SQL一塌糊涂,诚心请教高手,万分感谢!

解决方案 »

  1.   

    其实不是很明白你想要找什么样的内容,不过都给你弄出来了:
       1、select date_time,speed from traffic_data where date_time between now()+0 and now()-(4*100)
          这里的4就是你要的4分钟,但是建议做成触发器  2、如果你想找出所有的,但是都是每隔4分钟,也就是这些记录都是4分钟才发生的
        如:
           2011-06-23 20:10:00 1
           2011-06-23 20:12:00 2
           2011-06-23 20:14:00 3
           2011-06-23 20:14:00 1
           2011-06-23 20:14:00 2
           2011-06-23 20:16:00 2使用查询后就只有:
           2011-06-23 20:10:00 1
           
           2011-06-23 20:14:00 3
           2011-06-23 20:14:00 1
           2011-06-23 20:14:00 2
       这里请注意一定要确定起始时刻,如果没有的话就不行了。因为时间间隔都是相对的概念,刚说的例子就是从2011-06-23 20:10:00为时间基准点的,如果以2011-06-23 20:12:00为基准点的话,结果就是:
           
           2011-06-23 20:12:00 2
           
           2011-06-23 20:16:00 2
       结果就完全不一样了....请记得!   select date_time,speed from where floor(date_time+0)>20110623201000 and (abs(floor(date_time+0)-20120202110541 ) % 400)=0 order by date_time[这里400的意思就是4分钟,以2011-06-23 20:10:00为时间基准点的]
          
         
      

  2.   


    第二个SQL语句我试了,查询结果为空,
    select date_time,speed from traffic_data where floor(date_time+0)>20110623201000 and (abs(floor(date_time+0)-now() ) % 400)=0    order by date_time
      

  3.   


       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  4.   

    select date_time,speed from traffic_data where floor(date_time+0)>20110623201000 and (abs(floor(date_time+0)-now() ) % 400)=0 order by date_time
    这条SQL问题出在 (abs(floor(date_time+0)-now() ) % 400)=0 取余的余数都不等于0,所有查询出来的数据为空。
      

  5.   

    SQL语句-- ----------------------------
    -- Table structure for traffic_data
    -- ----------------------------
    CREATE TABLE `traffic_data` (
      `irn` int(11) NOT NULL auto_increment,
      `date_time` datetime default NULL,
      `day_of_week` smallint(6) default NULL,
      `occupancy` smallint(6) default NULL,
      `flowcount` smallint(6) default NULL,
      `speed` int(11) default NULL,
      `det_id` char(16) NOT NULL,
      `link_id` char(16) NOT NULL,
      `junction_id` char(16) NOT NULL,
      `region_id` char(16) NOT NULL,
      PRIMARY KEY  (`irn`)
    ) ENGINE=MyISAM AUTO_INCREMENT=41361 DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records 
    -- ----------------------------
    INSERT INTO `traffic_data` VALUES ('2', '2011-06-23 20:10:00', null, '1', '1', '1', '1', '1', 'JNC066111', 'REG001000');
    INSERT INTO `traffic_data` VALUES ('3', '2011-06-23 20:12:00', null, '1', '1', '1', '1', '1', 'JNC066111', 'REG001000');
    INSERT INTO `traffic_data` VALUES ('4', '2011-06-23 20:14:00', null, '1', '1', '2', '2', '2', 'JNC066112', 'REG001000');
    INSERT INTO `traffic_data` VALUES ('5', '2011-06-23 20:14:00', null, '1', '2', '1', '2', '2', 'JNC066112', 'REG001000');
    INSERT INTO `traffic_data` VALUES ('6', '2011-06-23 20:16:00', null, '1', '3', '1', '6', '1', 'JNC066112', 'REG002000');
    INSERT INTO `traffic_data` VALUES ('7', '2011-06-23 20:18:00', null, '1', '1', '1', '1', '2', 'JNC066112', 'REG002000');
    INSERT INTO `traffic_data` VALUES ('1', '2011-06-23 20:20:00', '1', '1', '1', '1', '1', '1', '1', '1');
    想要结果SQL语句:CREATE TABLE `traffic_data222` (
      `irn` int(11) NOT NULL auto_increment,
      `date_time` timestamp NULL default NULL,
      `day_of_week` smallint(6) default NULL,
      `occupancy` smallint(6) default NULL,
      `flowcount` smallint(6) default NULL,
      `speed` int(11) default NULL,
      `det_id` char(16) default NULL,
      `link_id` char(16) default NULL,
      `junction_id` char(16) default NULL,
      `region_id` char(16) default NULL,
      PRIMARY KEY  (`irn`)
    ) ENGINE=MyISAM AUTO_INCREMENT=41361 DEFAULT CHARSET=utf8;-- ----------------------------
    -- Records 
    -- ----------------------------
    INSERT INTO `traffic_data222` VALUES ('1', '2011-06-23 20:14:00', null, '1', '1', '2', '1', '1', 'JNC066111', 'REG001000');
    INSERT INTO `traffic_data222` VALUES ('2', '2011-06-23 20:18:00', null, null, null, '4', null, null, null, null);
    INSERT INTO `traffic_data222` VALUES ('3', '2011-06-23 20:22:00', null, null, null, '1', null, null, null, null);
      

  6.   


    1) |   1 | 2011-06-23 20:14:00 |        NULL |         1 |         1 |     2 |    1   | 1       | JNC066111   | REG001000 | 
    这条记录中的数据是怎么来的?det_id=1, link_id=1 这两个字段的计算逻辑是什么?如何得到的?2)  |   2 | 2011-06-23 20:18:00 |        NULL |      NULL |      NULL |     4 | NULL   | NULL    | NULL        | NULL      |
    这条记录为什么是其它字段是NULL? speed=4 是怎么得到的?为什么和原表中的|   7 | 2011-06-23 20:18:00 的不一致?3) 2011-06-23 20:22:00 ,由于原表中并无22分的数据,如果需要显示,则需要另外一张辅助表,或者自行在程序中处理显示。