【问题标题】:SQL Query to get the Max Date of a certain Status and subract that from the Max Date of another StatusSQL查询获取某个状态的最大日期并从另一个状态的最大日期中减去
【发布时间】:2015-09-08 19:01:13
【问题描述】:

一个例子是..假设一张票处于新状态。我想获取新状态的 MAX 日期和已完成状态的最大日期,并计算 MAX 已完成状态与 MAX 新状态之间的差异

例如。

SELECT t.ID,
       MAX(update_date) WHERE t.status = 'New' start_time,
       MAX(update_date) WHERE t.status = 'Completed' stop_time,
DATEDIFF(second, MAX(update_date), MAX(update_date)) elapsed_sec
FROM xxx.dbo t
GROUP BY t.ID;

非常感谢,

P

【问题讨论】:

    标签: sql sql-server datetime metrics


    【解决方案1】:
    SELECT
        t.id
        ,DATEDIFF(second, start_time, stop_time) elapsed_sec
    FROM (
        SELECT
            ID,
            (SELECT MAX(update_date) from xxx.dbo WHERE status = 'New' AND ID=t2.ID) start_time,
            (SELECT MAX(update_date) from xxx.dbo WHERE status = 'Completed' AND ID=t2.ID) stop_time
        FROM xxx.dbo t2
    ) t
    

    【讨论】:

    • 非常感谢!万分感谢!祝你有美好的一天!
    【解决方案2】:

    我建议使用条件聚合而不是相关子查询:

    SELECT t.ID,
           MAX(CASE WHEN t.status = 'New' THEN update_date END) as start_time,
           MAX(CASE WHEN t.status = 'Completed' THEN update_date END) as stop_time,
           MAX(update_date) WHERE t.status = 'Completed' stop_time,
           DATEDIFF(second,
                    MAX(CASE WHEN t.status = 'New' THEN update_date END),
                    MAX(CASE WHEN t.status = 'Completed' THEN update_date END)
                   ) as elapsed_sec
    FROM xxx.dbo t
    GROUP BY t.ID;
    

    【讨论】:

    • 闲散的好奇心:你为什么建议这个而不是相关子查询?
    • 相关的子查询需要更多的工作。您已经在进行聚合以删除重复项。没有理由做额外的工作——即使有索引——来识别你想要的信息。而且,如果您没有正确的索引,那么性能差异将非常明显。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多