【问题标题】:Select timediff between rows of 2 different columns in MSSQL在 MSSQL 中选择 2 个不同列的行之间的 timediff
【发布时间】:2021-06-23 10:53:42
【问题描述】:

我正在尝试在 SQL 中查找电话之间的时差。我的示例数据看起来像

name call_start call_finished
Johnny 2021-05-21 10:52:22.000 2021-05-21 10:52:25.000
Peter 2021-05-21 10:52:43.000 2021-05-21 10:53:10.000
Peter 2021-05-21 10:54:01.000 2021-05-21 10:54:01.000
Johnny 2021-05-21 10:53:48.000 2021-05-21 10:53:51.000
Peter 2021-05-21 10:54:14.000 2021-05-21 10:56:31.000
Johnny 2021-05-21 10:56:33.000 2021-05-21 10:56:38.000
Johnny 2021-05-21 10:58:13.000 2021-05-21 10:58:52.000
Johnny 2021-05-21 11:00:37.000 2021-05-21 11:00:37.000
Johnny 2021-05-21 11:03:14.000 2021-05-21 11:04:06.000
Peter 2021-05-21 11:05:20.000 2021-05-21 11:05:20.000

我想为每个name 找出call_finishedcall_start 之间的区别,以便生成一个Time_since_last_call 列。

name call start call_finished Time_since_last_call
Johnny 2021-05-21 10:52:22.000 2021-05-21 10:52:25.000 Null
Peter 2021-05-21 10:52:43.000 2021-05-21 10:53:10.000 Null
Peter 2021-05-21 10:54:01.000 2021-05-21 10:54:01.000 51
Johnny 2021-05-21 10:53:48.000 2021-05-21 10:53:51.000 83
Peter 2021-05-21 10:54:14.000 2021-05-21 10:56:31.000 13
Johnny 2021-05-21 10:56:33.000 2021-05-21 10:56:38.000 162
Johnny 2021-05-21 10:58:13.000 2021-05-21 10:58:52.000 95
Johnny 2021-05-21 11:00:37.000 2021-05-21 11:00:37.000 105
Johnny 2021-05-21 11:03:14.000 2021-05-21 11:04:06.000 157
Peter 2021-05-21 11:05:20.000 2021-05-21 11:05:20.000 529

问题

  • 如何为每个名称动态执行此操作?
  • 是否可以只查找每天的时差?那么Time_since_last_call 不是在天数之间计算的吗?

【问题讨论】:

    标签: sql-server azure-sql-database


    【解决方案1】:

    您可以使用DATEDIFFLAG 轻松实现此目的:

    USE Sandbox;
    GO
    CREATE TABLE dbo.YourTable ([Name] varchar(10),
                                CallStart datetime,
                                CallFinished datetime);
    GO
    INSERT INTO dbo.YourTable
    VALUES('Johnny','2021-05-21T10:52:22.000','2021-05-21T10:52:25.000'),
          ('Peter','2021-05-21T10:52:43.000','2021-05-21T10:53:10.000'),
          ('Peter','2021-05-21T10:54:01.000','2021-05-21T10:54:01.000'),
          ('Johnny','2021-05-21T10:53:48.000','2021-05-21T10:53:51.000'),
          ('Peter','2021-05-21T10:54:14.000','2021-05-21T10:56:31.000'),
          ('Johnny','2021-05-21T10:56:33.000','2021-05-21T10:56:38.000'),
          ('Johnny','2021-05-21T10:58:13.000','2021-05-21T10:58:52.000'),
          ('Johnny','2021-05-21T11:00:37.000','2021-05-21T11:00:37.000'),
          ('Johnny','2021-05-21T11:03:14.000','2021-05-21T11:04:06.000'),
          ('Peter','2021-05-21T11:05:20.000','2021-05-21T11:05:20.000');
    GO
    SELECT Name,
           CallStart,
           CallFinished,
           DATEDIFF(SECOND,LAG(CallFinished) OVER (PARTITION BY [Name] ORDER BY CallStart),CallStart) AS TimeSinceLastCall
    FROM dbo.YourTable
    ORDER BY CallStart;
    
    GO
    
    DROP TABLE dbo.YourTable;
    

    如果您不希望它分散几天(此方案没有示例数据),这意味着每天的第一个呼叫(对于每个人)将具有值 NULLTimeSinceLastCall,然后将CONVERT(date,CallStart)CAST(CallStart AS date) 添加到PARTITION BY 子句中。

    【讨论】:

    • 喜欢DATEDIFF(SECOND,LAG(Call_Finished) OVER (PARTITION BY CAST([Call Start] AS date), [Name] ORDER BY [Call Start]),[Call Start]) AS TimeSinceLastCall ?
    猜你喜欢
    • 2020-07-09
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2019-01-11
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多