SQL:找到最长的日期差距
我有一个包括2个字段的表:独一ID,用户ID(外键)和日期时刻.这是处事的会见日记.我在SQL Server事变,但我会浏览不行知的谜底. 我想行使SQL为某个用户查找最长间隙开始的ID. 譬喻,假设我的值如下(一个用户的简化): ID | User-ID | Time ---------------------------------- 1 | 1 | 11-MAR-09,8:00am 2 | 1 | 11-MAR-09,6:00pm 3 | 1 | 13-MAR-09,7:00pm 4 | 1 | 14-MAR-09,6:00pm 假如我为用户1搜刮最长的间隙,我将获得ID 2(在哪里获得间隙的长度也很好,然后,但更不重要). 在SQL中实现这一方针的最有用要领是什么? 留意:ID不必然是次序的. 感谢 办理要领与数据库无关,属于richardtallent的变体,但没有限定.从这个配置开始: create table test(id int,userid int,time datetime) insert into test values (1,1,'2009-03-11 08:00') insert into test values (2,'2009-03-11 18:00') insert into test values (3,'2009-03-13 19:00') insert into test values (4,'2009-03-14 18:00') (我这是SQL Server 2008,但不该该) 运行此查询: select starttime.id as gapid,starttime.time as starttime,endtime.time as endtime,/* Replace next line with your DB's way of calculating the gap */ DATEDIFF(second,starttime.time,endtime.time) as gap from test as starttime inner join test as endtime on (starttime.userid = endtime.userid) and (starttime.time < endtime.time) left join test as intermediatetime on (starttime.userid = intermediatetime.userid) and (starttime.time < intermediatetime.time) and (intermediatetime.time < endtime.time) where (intermediatetime.id is null) 给出以下内容: gapid starttime endtime gap 1 2009-03-11 08:00:00.000 2009-03-11 18:00:00.000 36000 2 2009-03-11 18:00:00.000 2009-03-13 19:00:00.000 176400 3 2009-03-13 19:00:00.000 2009-03-14 18:00:00.000 82800 然后,您可以按次序删除间隙表达式,然后选择最佳功效. 一些表明:就像richardtallent的谜底一样,你插手表格以找到一个’其后’的记录 – 这根基大将全部记录与他们其后的记录中的任何一个配对(以是对1,2 1,1 3,1 4,2 3,2 4,3 4).然后是另一个自毗连,这次是左毗连,以找到之前选择的两个之间的行(1 2 null,1 3 2,1 4 2,1 4 3,2 3 null,2 4 3,3 4空值).可是,WHERE子句将这些过滤掉(仅保存没有中间行的行),因此只保存1 2 null,2 3 null和3 4 null. TAA-DAA! 假如也许的话,也许会在哪里有两次沟通的时刻(‘间隙’为0)那么你必要一种要领来冲破相关,正如Dems指出的那样.假如您可以行使ID作为决胜局,那么请变动,譬喻 and (starttime.time < intermediatetime.time) 至 and ((starttime.time < intermediatetime.time) or ((starttime.time = intermediatetime.time) and (starttime.id < intermediatetime.id))) 假设’id’是冲破相关的有用方法. 究竟上,假如你知道ID会单调增进(我知道你说’不次序’ – 不清晰这是否意味着它们不会跟着每一行增进,可能只是两个相干条目标ID也许不是次序由于譬喻另一个用户之间有条目),你可以在全部较量中行使ID而不是时刻来使这更简朴. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |