好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLServer分组查询相邻两条记录的时间差

首先,我们通过数据库中表的两条记录来引出问题,如下图 以上为一个记录操作记录的表数据。OrderID为自增长列,后面依次为操作类型,操作时间,操作人。 现在的问题是:要求筛选出数据库中从接收到送出的时间差超过2天的全部记录。即如上图两笔单据中,红色

首先,我们通过数据库中表的两条记录来引出问题,如下图

以上为一个记录操作记录的表数据。OrderID为自增长列,后面依次为操作类型,操作时间,操作人。

现在的问题是:要求筛选出数据库中从[接收]到[送出]的时间差超过2天的全部记录。即如上图两笔单据中,红色框既是要筛选出的,绿色框为正常过滤的。

为了定位相邻记录,方法为给查询语句的返回记录加个自动编号列放入临时表中,再对临时表进行操作。

View Code

 --  1.首先查出表中符合條件的所有信息 
 select   IDENTITY ( int , 1 , 1 )  as  OIndex, *   into  #temp1  from   操作記錄表
  where  OrderID  in  ( select  OrderID  from  單據表  where  OrderNo  like   '  APP%  ' )  order   by   OrderID,OperateDate

  --  2.簽核時間Delay在2~7天之內 
 select  a.OrderID,a.OperateUser,a.OperateName  into  #temp2  from  #temp1 a  inner   join   #temp1 b 
  on  a.OrderID = b.OrderID  and  a.OperateUser =  b.OperateUser
  and  a.OperateType =  '  Receive  '   and  b.OperateType =  '  Send  '   and  b.OIndex  =  a.OIndex +  1 
 where   datediff (dd,a.operatedate,b.operatedate) >  2   and   datediff (dd,a.operatedate,b.operatedate)   7   and  a.operatedate >=  '  2012-06-10  ' 
 group   by   a.OrderID,a.OperateUser,a.OperateName
  order   by   a.OrderID
  --  3.異常單據和異常操作人員信息 
 select   *   from  #temp2 

可以看出,关键在分组查询后对数据的比对。

查看更多关于SQLServer分组查询相邻两条记录的时间差的详细内容...

  阅读:59次