【问题标题】:SQL Joining / merging two event tables, sensitive to corresponding timeSQL Joining/merging两个事件表,对对应时间敏感
【发布时间】:2020-04-03 15:54:35
【问题描述】:

表 1 有开放时间。

id |  OpenTime
1  | 2019-12-02 16:52:42.9130000
1  | 2019-12-02 16:55:57.5560000
1  | NULL
1  | 2019-12-02 16:59:09.5640000
1  | 2019-12-02 17:01:35.3510000
2  | 2019-12-02 17:02:55.0270000
2  | 2019-12-02 17:05:41.3930000
2  | 2019-12-02 17:07:41.7870000

表 2 有关闭时间。

id |  CloseTime
1  | NULL
1  | 2019-12-02 16:56:19.2560000
1  | 2019-12-02 16:57:47.5790000
1  | 2019-12-02 16:59:33.5390000
1  | 2019-12-02 17:01:55.6040000
2  | 2019-12-02 17:04:00.7780000
2  | 2019-12-02 17:06:04.4830000

我需要为每个打开到关闭时间进行DATEDIFF 计算。

一次只能打开一次,但是我们可能会错过该活动。

我们可能还没有结束活动。

一个 OpenTime 通常会有一个对应的 CloseTime,其中 CloseTime 大于 OpenTime,但小于下一个 OpenTime。

id |  OpenTime                    | CloseTime                    | Datedif
1  | 2019-12-02 16:52:42.9130000  | NULL                         | NULL
1  | 2019-12-02 16:55:57.5560000  | 2019-12-02 16:56:19.2560000  | 
1  | NULL                         | 2019-12-02 16:57:47.5790000  | NULL
1  | 2019-12-02 16:59:09.5640000  | 2019-12-02 16:59:33.5390000  | 
1  | 2019-12-02 17:01:35.3510000  | 2019-12-02 17:01:55.6040000  | 
2  | 2019-12-02 17:02:55.0270000  | 2019-12-02 17:04:00.7780000  | 
2  | 2019-12-02 17:05:41.3930000  | 2019-12-02 17:06:04.4830000  | 
2  | 2019-12-02 17:07:41.7870000  | NULL                         | NULL

Datediff 只需几秒钟即可DATEDIFF(SECOND,OpenTime,CloseTime)

DROP TABLE IF EXISTS #NEWTABLE;
SELECT 
  a.ID,
  MAX(a.OpenTime) as OpenTime,
  MIN(b.CloseTime) as CloseTime ,
  DATEDIFF(SECOND, a.OpenTime, b.CloseTime) AS diffSeconds
INTO #NEWTABLE
FROM Table1  a
JOIN Table2 b
  ON a.Id= b.Id
WHERE 
a.Id = b.ID
and b.CloseTime> = a.OpenTime

Group by a.Id,DATEDIFF(SECOND, a.OpenTime, b.CloseTime)
order by diffSeconds desc

这不起作用,但我已尝试确保获得每个 OpenTime 的正确对应 CloseTime。我的代码为 8 个打开和关闭事件提供了 26 行输出。

【问题讨论】:

    标签: sql sql-server join merge union


    【解决方案1】:

    您可以使用LEAD查找下一个开放时间并从table2中获取相应的记录

    with cte as(
    select id, opentime, lead(opentime,1) over (order by opentime) nextopentime
    from table1
    where opentime is not null)
    select a.id, a.opentime, b.closetime
    from cte a 
        left join table2 b on a.id = b.id and b.closetime > a.opentime and b.closetime < a.nextopentime
    order by a.opentime
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多