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

系统 1969 0

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

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

以上为一个记录操作记录的表数据。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 分组查询相邻两条记录的时间差


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论