数据库表A存有如下类型的字段:
       Time                biaozhi       姓名
2010-07-08 12:34:56           1           s
2010-07-08 16:17:56           1           s
2010-07-09 11:13:13           2           s
2010-07-09 19:13:13           2           s
2010-07-10 11:13:13           2           s
2010-07-11 11:13:13           1           s
2010-07-12 14:13:13           1           s
biaozhi为一个标志字段。当标志从1变到2时,该Time字段的值为开始时间,当标志从2变到1时,Time字段的值为结束时间。
期望的查询结果为:
       开始时间             结束时间         姓名     
2010-07-09 11:13:13   2010-07-11 11:13:13     s请问大侠,这该如何实现?是在SQL语句里实现呢,还是对查询的结果进行过滤判断呀?就是希望把结果显示到stringgrid上。
各位大侠!指教!!!

解决方案 »

  1.   

    很简单
    sqlserver中有 case...when语法,看下帮助
    access中 有 好像是iif语法
      

  2.   

    大哥,case...when语法这个我也知道,但我怎么判断两行相邻的数据,biaozhi字段什么时候从1变为了2,或者从2变为了1呢?只有变化的时候,这时的时间字段才是我需要的丫。
      

  3.   

    为什么要判断相邻呢,case 1 时,取开始,case 2 时去结束,这根是否相邻有关系吗
      

  4.   

    我只需要标志字段变化时的时间啊,case 1 时取开始,case 2 时取结束,这不就好几个开始,好几个结束时间啦。我需要取从1变到2时和从2变到1时的这两个时间啊。
      

  5.   

    楼主是否是希望将标志相同并且相邻的所有记录,只保留第1笔及最后一笔记录,中间的记录全部过滤掉?
    如果是这样的话,感觉SQL语句实现起来比较困难,即使能实现,执行效率可能也比较低,个人建议有2种方案:
    1. 提取到Delphi中,然后一笔一笔的判断
    2. 在数据库中建个存储过程来处理,可能需要用到游标
      

  6.   

    用的什么数据库,如果用的是oracle可以用分析函数 lead,lag取后一条和前一条的记录,再进行处理。
      

  7.   

    就是取标志变化时的那个时间字段。提取到Delphi中,我该怎么实现某一行数据与相邻行数据的比较呢?用的是Query 。怎么循环遍历?
      

  8.   

      Select a.Time as 开始时间 From Table a where a.biaozhi=1 
      Rgight   Join
      Select b.Time as 开始时间,b.S From Table b where b.biaozhi=2 
    where a.s=b.s
      左连接     Left   Join   就是左邊的內容可以為空了 
    右连接     Rgight   Join   就是右邊的內容可以為空 
    完全连接   Inner   Join     就是兩邊的都可以為空 
      

  9.   

    可以结贴了,呵呵http://topic.csdn.net/u/20100713/08/67d0322f-1da1-479a-8ecb-c846661098f8.html
      

  10.   

    写两个函数
    f_getMaxTime(姓名当参数)和f_GetMinTimeSELECT f_getMintime(姓名) AS 开始时间,f_getMAXtime(姓名) AS 结束时间,姓名 FROM 表
    GROUP BY 姓名