Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL间隔表报告间隔?_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

如何使用SQL间隔表报告间隔?

如何使用SQL间隔表报告间隔?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,下表列出了不重叠的间隔,我想报告所有可能的间隔 我拥有的表格: Id StartDateTime EndDateTime 3004204 | 2014-01-01 12:47 | 2014-01-01 12:59 3004204 | 2014-01-01 13:00 | 2014-01-01 14:29 3004204 | 2014-01-01 14:30 | 2014-01-01 14:41 3004204 | 2014-01-02 18:01 | 2014-0

下表列出了不重叠的间隔,我想报告所有可能的间隔

我拥有的表格:

Id         StartDateTime        EndDateTime

3004204 | 2014-01-01 12:47 | 2014-01-01 12:59
3004204 | 2014-01-01 13:00 | 2014-01-01 14:29
3004204 | 2014-01-01 14:30 | 2014-01-01 14:41
3004204 | 2014-01-02 18:01 | 2014-01-02 18:14
3004204 | 2014-01-02 18:15 | 2014-01-02 18:29
3004204 | 2014-01-02 18:30 | 2014-01-02 18:44
3004204 | 2014-01-02 18:45 | 2014-01-02 18:59
3004204 | 2014-01-02 19:00 | 2014-01-02 19:29
我想要的是每个Id的每日差距报告。因此,在这种情况下,它将是:

Id          StartDateTime       EndDateTime

3004204 | 2014-01-01 12:59 | 2014-01-01 13:00
3004204 | 2014-01-01 14:29 | 2014-01-01 14:30
3004204 | 2014-01-02 18:14 | 2014-01-02 18:15
...
注意:间隙可以是任意长度,从1秒到23:59小时,当前仅显示每秒。我认为这需要使用滞后来完成,但这似乎相当低效

对于SQL Server 2014是否能够以比使用滞后和潜在客户更有效的方式实现这一点,有何建议


谢谢

每天使用LEAD查找每个id的差距。它既高效又简单

SELECT *
FROM
(
    SELECT  ID,
            [GapStart]  = EndDateTime,
            [GapEnd]    = LEAD(StartDateTime) OVER (PARTITION BY ID, CAST(StartDateTime AS DATE) ORDER BY StartDateTime)
    FROM @yourTable
) A
WHERE GapEnd IS NOT NULL --Filters out last row of each day

它不漂亮,但应该有用

select * from  (
    select a.Id,a.EndDate,b.StartDate
      ,row_number() over (partition by a.EndDate order by b.StartDate) as r
    from temp.test a inner join
      temp.test b on a.EndDate <= b.StartDate
    where year(a.EndDate) = year(b.StartDate)
      and month(a.EndDate) = month(b.StartDate)
      and day(a.EndDate) = day(b.StartDate)) as t
     where r = 1 and EndDate != StartDate

*忘记添加要在EndDate=StartDate时消除的最后一个过滤器

查看这篇关于此主题的文章。如果再重读一遍这个问题,OP会说,不重叠的时间间隔和每天根据IdI报告的间隔都会让人感觉舒服。我做了同样的事情,我不想承认。谢谢你的道歉。在这个网站上,你很少会遇到真正有个性的人。我印象深刻,你的解决方案似乎短得惊人。我将在我的数据上测试它并报告:。谢谢大家帮助我!为什么要比较日期的每个部分,而不是在一行中比较整个日期。只需将每个值转换为日期。另外,在你的逻辑中,你只比较同一个ID的日期在哪里?OP没有提到ID的边界,所以我没有包括它。虽然这只是一个微不足道的改变。关于转换,你是对的,尽管我不确定一种机制是否比另一种更有效。OP说每天根据Id报告差距。我也不确定效率。我的猜测大致相同,但最好尽量简单