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

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

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

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

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

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

--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-08-24 16:59:27

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

hive实现根据用户分组,按用户记录求上下两条记录的时间差

在mysql,数据如下:#查询某一用户该日抽奖时间 select draw_time from user_draw_log where user_id = 1 and draw_date='2016-03-09' order by id; +---------------------+ | draw_time | +---------------------+ | 2016-03-09 13:52:46 | | 2016-03-09 13:52:53 | | 2016-03-09 13:53:0

关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】

做项目中间遇到一个很诡异的问题: 有两个表:A和AHistory(A表记录删除后存入此表,A的历史表),当我复制一条记录到AHistory表时,此时A表和AHistory表两条记录id相同,后续通过修改操作将两表任意一条记录更新为不同的信息,但ID仍然相同:此时,如果用hibernate映射到实体类中时,想象中的应该是两个不同的实体类,拥有不同的属性等. 然而,当我在程序中查询这两条ID相同的记录后,所得到两个的hibernate映射实体类却完全相同. 通过此问题,才知道hibernate会将查

mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享

摘要: 下文讲述使用sql脚本实现相邻两条数据相减的方法,如下所示: 实验环境:sql server 2008 R2 实现思路: 1.使用cte表达式,对当前表进行重新编号 2.使用左连接对 表达式 生成的临时表进行错位连接,并对生成的新纪录中两列进行相减 create table [maomao365] (sort varchar(30),qty int); go ----生成基础数据 insert into [maomao365](sort, qty)values ('maomaoA',10

Oracle查询前10条记录及分页查询(第5条到第10记录)

如果你想了解Oracle查询前10条记录的相关实际应用方案的话,你就可以点击以下的文章对其在实际相关操作中的正确用法,有一个更加完善的认识,希望你在浏览完以下的文章会以下就是正文的详细内容的介绍. 在Oracle怎样查询表中的top10条记录呢? select *   from test   where rownum <=10   下面是关于rownum的介绍 Rownum和row_number() over()的使用 ROWNUM是Oracle从8开始提供的一个伪列,是把SQL出来的结果进行编

[mysql] 查询前几条记录

From: http://www.cnblogs.com/xuxm2007/archive/2010/11/16/1878211.html SELECT   *   FROM   table   LIMIT   5;           select     *     from     issu_info     limit     0,6             Limit     0,6       这里是对的,显示前6条                   select     *   

分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)(转)

转载地址:http://www.cnblogs.com/linJie1930906722/p/6036053.html partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用. 准备测试数据: create table Student --学生成绩表 ( id int, --主键 Grad

sqlserver--获取同组数据的前两条记录

不啰嗦,直接上图,大概实现效果如下: 有上面这样一份数据,将他们按照userAccount和submitTime进行分组,然后提前每组数据的前两条记录 提取后数据如下: 实现的SQL如下: select t.* from (select *,row_number() over(partition by userAccount, submitTime order by submitTime) rn from demoTable) t where rn <=2 @[email protected]!

Dynamics CRM OData 查询超过50条记录的数据(Retrieving More than 50 records using OData)

在通过ODdata方式获取CRM数据时,默认查询出来的results只有50条数据,可以通过JSON返回的Object中的"_next"属性作为URL循环获取直到该属性为空 示例代码如下: relatedAccounts = []; function onload() { var serverUrl = Xrm.Page.context.getServerUrl(); var oDataUri = serverUrl + "/xrmservices/2011/Organiza

查询后n条记录

查询后n条记录 SELECT * FROM tb_stu ORDER BY id ASC LIMIT n