加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

SQL:找到最长的日期差距

发布时间:2021-03-07 13:16:54 所属栏目:编程 来源:网络整理
导读:我有一个包括2个字段的表:独一ID,用户ID(外键)和日期时刻.这是处事的会见日记.我在SQL Server事变,但我会浏览不行知的谜底. 我想行使SQL为某个用户查找最长间隙开始的ID. 譬喻,假设我的值如下(一个用户的简化): ID | User-ID | Time-----------------------

我有一个包括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而不是时刻来使这更简朴.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读