数据库表结构如下rundata表:
id datetime          value
1 2009-08-06 08:30 20
1 2009-08-06 08:32 23
1 2009-08-06 08:34 22
1 2009-08-06 08:36 25
1 2009-08-06 08:39 29
1 2009-08-06 08:40 23
1 2009-08-06 08:44 30
1 2009-08-06 08:47 31
1 2009-08-06 08:51 34
1 2009-08-06 08:53 36
2 2009-08-06 08:32 40
2 2009-08-06 08:34 42
2 2009-08-06 08:37 43
2 2009-08-06 08:39 45
2 2009-08-06 08:45 47
1 2009-08-07 08:30 30
1 2009-08-07 08:34 32
1 2009-08-07 08:37 33
1 2009-08-07 08:41 34
1 2009-08-07 08:44 36
1 2009-08-07 08:48 37
1 2009-08-07 08:50 39要求需要同时满足如下3个条件:
1. 按id来搜索前一天的所有结果,如搜索8.6日id=1的所有数据;
2. 以条件1为前提,以5分钟为间隔取得所有数据,如08:30,08:35,08:40,表中不足整5分钟的取最临近的时间数据;
3. 将搜索结果存在临时表或view中。

解决方案 »

  1.   

    第二点在sql中处理有些困难啊。
      

  2.   

    2的要求就是实现类似
    id datetime value
    1 2009-08-06 08:30 20
    1 2009-08-06 08:40 23
    1 2009-08-06 08:44 30
    1 2009-08-06 08:51 34
    这样每5分钟取一个数据点,表中不足整5分钟的取最临近的时间数据。
      

  3.   

    你的意思当然是明白的,不过靠近5分钟这样的不精确需求,不经过对比运算是很难知道的,这不是sql的强项,当然,在oracle中,写pl/sql存储过程也是可以的。就是有点复杂了。
      

  4.   

    DECLARE @T TABLE(
    ID INT,
    [DATETIME] DATETIME,
    [VALUE] INT
    )
    INSERT INTO @T
    SELECT 1,'2009-08-06 08:30', 20 UNION ALL
    SELECT 1 ,'2009-08-06 08:32', 23 UNION ALL
    SELECT 1 ,'2009-08-06 08:34', 22 UNION ALL
    SELECT 1 ,'2009-08-06 08:36', 25 UNION ALL
    SELECT 1 ,'2009-08-06 08:39', 29 UNION ALL
    SELECT 1 ,'2009-08-06 08:40', 23 UNION ALL
    SELECT 1 ,'2009-08-06 08:44', 30 UNION ALL
    SELECT 1 ,'2009-08-06 08:47', 31 UNION ALL
    SELECT 1 ,'2009-08-06 08:51', 34 UNION ALL
    SELECT 1 ,'2009-08-06 08:53', 36 UNION ALL
    SELECT 2 ,'2009-08-06 08:32', 40 UNION ALL
    SELECT 2 ,'2009-08-06 08:34', 42 UNION ALL
    SELECT 2 ,'2009-08-06 08:37', 43 UNION ALL
    SELECT 2 ,'2009-08-06 08:39', 45 UNION ALL
    SELECT 2 ,'2009-08-06 08:45', 47 UNION ALL
    SELECT 1 ,'2009-08-07 08:30', 30 UNION ALL
    SELECT 1 ,'2009-08-07 08:34', 32 UNION ALL
    SELECT 1 ,'2009-08-07 08:37', 33 UNION ALL
    SELECT 1 ,'2009-08-07 08:41', 34 UNION ALL
    SELECT 1 ,'2009-08-07 08:44', 36 UNION ALL
    SELECT 1 ,'2009-08-07 08:48', 37 UNION ALL
    SELECT 1 ,'2009-08-07 08:50', 39 DECLARE @ID INT
    SET @ID=1SELECT IDENTITY(INT,1,1) 'TEMPID',* INTO #TEMP FROM @T  
    WHERE ID=@ID AND DATEDIFF(DAY,[DATETIME],GETDATE())=3--这里是与当前日期相关天数
    --SELECT * FROM #TEMP
    --梁哥作品,版权没有,翻版不究
    declare @begin_date datetime,@end_date datetime;
    select @begin_date=MIN([DATETIME]),@end_date=MAX([DATETIME]) FROM #TEMP;with liang as
    (
        select @begin_date AS date
        union all
        select dateadd(mi,5,date) from liang
        where dateadd(mi,5,date) <=@end_date
    )
    --鸭子作品,版权没有,翻版不究
    ,GUGUDA AS
    (select T1.DATE,T2.TEMPID,DATEDIFF(MI,T2.[DATETIME],T1.DATE) 'COL1' 
    from liang T1
    INNER JOIN #TEMP T2 ON T2.[DATETIME]<=T1.DATE

    SELECT ID,[DATETIME],[VALUE] FROM #TEMP T1 WHERE EXISTS(
    SELECT TEMPID FROM GUGUDA G1
    WHERE NOT EXISTS(SELECT 1 FROM GUGUDA G2 WHERE G2.DATE=G1.DATE AND G2.COL1<G1.COL1) AND G1.TEMPID=T1.TEMPID)
    DROP TABLE #TEMP
    /*
    1 2009-08-06 08:30:00.000 20
    1 2009-08-06 08:34:00.000 22
    1 2009-08-06 08:40:00.000 23
    1 2009-08-06 08:44:00.000 30
    1 2009-08-06 08:47:00.000 31
    */
      

  5.   

    第一个的话 sql中支持>,<等符号直接来表示 直接比较就行了
    第二个的话 你最主要的是 获得一个数据 比如说:8:43 你要确定他是属于8:40还是8:45
    第三个就更简单了 用视图就ok了
      

  6.   

    select * from rundata (select * from  where id =1 )  where datetime betwen 2009-08-06 00:00:00 and 2009-08-07 00:00:00)
      

  7.   

    http://topic.csdn.net/u/20090809/12/ed672d49-b562-44c9-b1f9-baec85ef7d21.html?27236
      

  8.   

    谁有sybase的语法函数集么?
    该问题在DB2上可以搞定了,但sybase的函数和复杂查询与DB2都不同,资料也少啊。