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

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

时间: 2024-09-11 01:19:42

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

sqlserver分组取前n条记录

  1.前言. 这个有两种方法.1是用in,2是用row_number(),可根据情况来用.两种都可以. 2.举例. 方法1: Java代码 select a.* from table1 a where a.column1 in (select max(column1) from table1 group by a.column2,column3) 方法2: Java代码 with nyr as ( select NYR,QYZX_DM,FXSP_XH,SPBM_DLJ,WBSP_GG,JGLX

SQL Server查询前N条记录的常用方法小结_MsSql

本文实例讲述了SQL Server查询前N条记录的常用方法.分享给大家供大家参考.具体如下: SQL Server查询前N条记录是我们经常要用到的操作,下面对SQL Server查询前N条记录的方法作了详细的介绍,如果您感兴趣的话,不妨一看. SQL Server查询前N条记录: 因为id可能不是连续的,所以不能用取得10<id<20的记录的方法. 有三种方法可以实现: 一.搜索前20条记录,指定不包括前10条 语句: 复制代码 代码如下: select top 20 * from tbl w

不同数据库中查询前几条记录的用法(SQL Server/Oracle/Postgresql)

SQL在不同数据库中查询前几条记录的用法分类 1. orACLE Select * FROM TABLE1 Where ROWNUM<=N 2. INFORMIX Select FIRST N * FROM TABLE1 3. DB2 Select * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM Where ROWNUM<=N 或者Select COLUMN FROM TABLE FETCH FIRST N ROWS ONLY 4. SQL

请问为什么我的mybatis 关联查询只有一条记录,但是日志打印出来的Total: 3, 谢谢

问题描述 请问为什么我的mybatis 关联查询只有一条记录,但是日志打印出来的Total: 3, 谢谢 SELECT * FROM JiKeUser; 这个里面有如下三条记录, id userName password ------ --------- ---------- 2 jike00100 666666 3 jike00200 888888 8 author001 123456 SELECT * FROM author; 这个里面也是三条记录, id realName userID I

MySQL查询倒数第二条记录实现方法_Mysql

有时候会用到查询倒数第二条记录 复制代码 代码如下: last=HolderChangeHistory.find_by_sql (["               SELECT * FROM holder_change_histories                   where treasure_id = ?                   order by id desc                     limit   1,1  ",               

sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢?

问题描述 sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? 解决方案 http://www.2cto.com/database/201509/442742.html 解决方案二: http://zhidao.baidu.com/link?url=zu-YuSRPF-4RKb_yrqC7cZm4Smbz_pWS31ltTFn6HIknGbUHgcOtH8FavG9o

hibernate 查询40万条记录出现 java.sql.SQLException 数字溢出 异常

问题描述 大家好,我用hibernate 查询40万条记录,结果出现 java.sql.SQLException 数字溢出 异常,怎么回事啊?难道 hibernate 支持不了几十万的数据检索???我的代码: List list = session.createQuery("from 表 ").list(); 解决方案 你有没有设置Lazy Loading呀..如果你设的为立即加载的话,几十万的话数据.溢出很正常呀..解决方案二:大哥 你一起弄这么多数据出来能不溢出么?用LAZY解决方

sql中查出每个分组的前n条记录

查询指定分类的前n篇文章 create table `person` (   `person` varchar(10),   `group` int,   `age` int ); insert into `person` values ('Bob', 1, 32), ('Jill', 1, 34), ('Shawn', 1, 42), ('Jake', 2, 29), ('Paul', 2, 36), ('Laura', 2, 39); // 查询语句 SELECT a.person, a.g

DEV Gridcontrol 查询得到0条记录时显示自定义的字符提示/显示

private void gridView_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e) { if (this.judge_ds(dsDt)) { string str = "没有查询到你所想要的数据!"; Font f = new Font("宋体", 10, FontStyle.Bold); Rectangle r =