【问题标题】:SQL query to get DateDiff of the last two recordsSQL查询获取最后两条记录的DateDiff
【发布时间】:2012-11-01 21:36:54
【问题描述】:

我在 SQL Server 2008 R2 中有一个名为 Event 的表,其中 eventNum 作为主键,日期作为 datetime2(7)。我正在尝试获取表中最后两行的日期并以分钟为单位获取差异。这是我目前拥有的:

Select DATEDIFF(MI, e.date,(Select e2.date from Event e2 where eventNum = (Select MAX(e2.eventNum))))
    From Event e
    Where eventNum = (Select MAX(e.eventNum)-1 from e)

我得到这个错误:

列名无效 'Select eventNum from Event where eventNum = 从 Event' 中选择 MAX(eventNum)。

我已经更改了 100 次,但无法正常工作。有什么帮助吗?

【问题讨论】:

    标签: sql sql-server datediff


    【解决方案1】:

    你可以使用ROW_NUMBER

    WITH CTE AS 
    (
       SELECT RN = ROW_NUMBER() OVER (ORDER BY eventNum DESC)
            , date
       FROM Event 
    )
    SELECT Minutes = DATEDIFF(minute, 
               (SELECT date FROM CTE WHERE RN = 2),
               (SELECT date FROM CTE WHERE RN = 1))
    

    小提琴:http://www.sqlfiddle.com/#!3/3e9c8/17/0

    【讨论】:

    • 您可以添加top 1 子句。现在它为表中存在的每一行重复结果
    • @w0lf: 或者删除最后一个FROM CTE
    • CTE 就像一把大锤敲碎坚果。您可以通过它生成的查询计划来判断。此外,-1 表示答案错误时,您已经更正了。
    【解决方案2】:

    这不必像蒂姆的回答那样经过表格两次。

    select datediff(mi, min(x.date), max(x.date))
    from (
        select top(2) *
        from Event e
        order by eventNum desc
    ) x
    

    假设你总是有 2 条或更多记录,并且时间单调增加,那么上述工作。

    • 如果只有一条记录,则返回 0(因为 max=min=singular record)。
    • 如果您的时间没有单调增加,可以对这个查询进行简单的调整

    例如

    select top(1) datediff(mi, x.date, y.date)
    from event x
    join event y on y.eventnum < x.eventnum
    order by x.eventnum desc, y.eventnum desc
    

    【讨论】:

    • 很好,但date 的顺序可能与eventNum 的顺序不同。如果日期差异的符号很重要,那么这是错误的。如果没有,那就是正确的。
    • 当 OP 只想要一个值时,我不确定毫秒或多或少是否是这个问题的关键因素,因为订单列是主键列。
    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 2011-01-12
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多