【问题标题】:Calculating time between entries in sql计算sql中条目之间的时间
【发布时间】:2013-08-20 08:39:31
【问题描述】:

伙计们,我有一个表,其中有一个名为 time 的列。它捕获每个记录条目进入数据库的时间。我想查询并返回另一列,显示一个条目与其之前的条目之间的持续时间。例如,如果我在今天下午 12:00 为 john 存储记录,然后在下午 1:10 存储 Ali 的记录,我想要另一列显示 01:10:00(即 HH:MM:SS)。

我知道我可以按如下方式查询每个列号。

SELECT ROW_NUMBER() OVER (ORDER BY [followuptime]) from [dbo].[FollowUp] .

我想查询最大行数如下,但它失败并返回错误“windowed....”

SELECT MAX(ROW_NUMBER() OVER (ORDER BY [followuptime])) from [dbo].[FollowUp] .

我想使用 sql 的 DATEDIFF(interval,start_time,end_time); 函数,但现在我被卡住了。请感谢您的帮助或任何替代方案。

【问题讨论】:

  • 您使用的是什么版本的 SQL-Server? 2012 支持 LAGLEAD 函数,这将使以前很容易获得。 --> LAG(followuptime) OVER(ORDER BY followuptime)`
  • 另外,如果您在没有 PARTITION BY 的情况下执行 MAX(ROW_NUMBER()...,则最大行号将与 COUNT(*) 相同。因此,对于失败的第二个查询:SELECT MAX(ROW_NUMBER() OVER (ORDER BY [followuptime])) from [dbo].[FollowUp],您可以使用 --> SELECT COUNT(*) FROM dbo.Followup 获得相同的结果
  • SQL Server 2012 和工作室版本 11.0.2100.60。但它的说法 LAG 不是内置函数....
  • 我运行这个测试'SELECT [id],[followuptime],[remark],LAG([followuptime],1,0) OVER (ORDER BY [followuptime]) FROM [dbo] 。[跟进]; ' 但它的说法 LAG 不是一个有效的表达方式。在我执行之前它是如何识别它的。
  • 我看不出有任何原因这不起作用,您确定连接到 2012 实例吗?您的查询在 SQL Fiddle 上运行良好

标签: sql sql-server database datetime sql-server-2008-r2


【解决方案1】:

由于 SQL-Server 2008R2 不支持 LAG/LEAD,您需要使用 row_number 进行自联接以从前一行获取时间:

WITH OrderedResults AS
(   SELECT  [id],
            [followuptime],
            [remark],
            RowNumber = ROW_NUMBER() OVER (ORDER BY [followuptime]) 
    FROM    [dbo].[FollowUp]
)
SELECT  a.ID, 
        a.FollowUpTime, 
        a.Remark, 
        PreviousTime = b.FollowUpTime,
        MinutesDifference = DATEDIFF(MINUTE, b.FollowUpTime, a.FollowUpTime)
FROM    OrderedResults a
        LEFT JOIN OrderedResults b
            ON b.RowNumber = a.RowNumber - 1
ORDER BY a.FollowUpTime;

Example on SQL Fiddle

【讨论】:

    【解决方案2】:

    您不能将 MAX 应用于 ROW_NUMBER。使用 CTE 并查询。

    ;WITH MyCTE AS 
    (
        SELECT ROW_NUMBER() OVER (ORDER BY [followuptime]) AS RowNum
        FROM [dbo].[FollowUp]
    )
    
    SELECT MAX(RowNum)
    FROM MyCTE
    

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多