用于跟踪性能的时差 SQL 查询

问题描述

它是一个状态驱动的应用程序跟踪软件。模块中的一些基本表格是:

  • dbo.Application 包含 ApplicationID、FirstName、LastName、Email、ApplicationTimestamp、CurrentStatusID 列

  • dbo.ApplicationStatusHistory 包含列 ApplicationID、StatusID、StatusName、StatusTimestamp、isCurrent (1/0)

我想检查处理新申请的效率,并要求提供一份报告,说明申请在转移到第二状态(可以是许多事情,例如“拒绝”、“预定面试”等),适用于 2020 年收到的所有申请。

我尝试了以下方法,但它是错误的。

SELECT
    T1.Application_ID,    T1.FirstName,    T1.LastName,    T1.ApplicationTimestamp AS 'Application Received On',    T2.StatusID AS 'Current Status',    DATEDIFF(DAY,T2.StatusTimeStamp,T1.ApplicationTimestamp) AS 'Processing Time (Days)',    DATEDIFF(HOUR,T1.ApplicationTimestamp) AS 'Processing Time (Hours)',    DATEDIFF(MINUTE,T1.ApplicationTimestamp) AS 'Processing Time (Minutes)'
FROM
    dbo.Application T1
LEFT JOIN
    dbo.ApplicationStatusHistory T2
ON
    T1.Application_ID = T2.Application_ID
WHERE
    T1.ApplicationTimestamp BETWEEN '2020-01-01' AND '2020-12-31'
    AND T1.CurrentStatusID <> T2.StatusID

解决方法

在不了解更多数据结构的情况下,您似乎有一些状态字段,用于标识收到的申请中的数据“阶段”以安排面试。您可能希望根据每个各自的“状态”ID 对根表进行多个 JOIN。

所以,让我们假设你的状态码有一些连续的序列上下文

1 = Application Received
2 = Reviewed
3 = Rejected
4 = Interview
5 = Hired

如果应用程序以 1 的状态进入,那么它在历史/更改日志表中永远不会有任何正确的内容?所以,如果你在历史上找不到任何东西,那就是一个新的应用程序。一旦更改为“已审核”状态 (2),已接收 (1) 将被放入历史记录中,依此类推。那是准确的吗?或者,状态历史表中是否总是有一个条目,即使在收到的第一个条目上也是如此。如果是这样,那将在您进行时简化一些。

SELECT
      T1.Application_ID,T1.FirstName,T1.LastName,T1.ApplicationTimestamp AS 'Application Received On',-- now compute differences...  Only doing days,but you get the idea
      DATEDIFF(DAY,coalesce( Received.Application_ID,now(),T1.ApplicationTimeStamp ) 
         as TimeSinceReceived,-- if there is a reviewed record,there should at least be the
      -- application original entry too
      case when Reviewed.Application_ID IS NULL
           then 0
           else 
      DATEDIFF(DAY,coalesce( Reviewed.StatusTimeStamp,now() ),coalesce( Received.StatusTimeStamp,T1.ApplicationTimeStamp )) end
         as TimeToReview,-- if there is a Rejected record,there should at least be the
      -- application original entry too
      case when Rejected.Application_ID IS NULL
           then 0
           else 
      DATEDIFF(DAY,coalesce( Rejected.StatusTimeStamp,T1.ApplicationTimeStamp )) end 
         as TimeToReject

      etc... for interviewed and hired as applicable

   FROM
      dbo.Application T1
         LEFT JOIN dbo.ApplicationStatusHistory Received
            ON T1.Application_ID = Received.Application_ID
            -- Status application received
            AND Received.StatusID = 1

         LEFT JOIN dbo.ApplicationStatusHistory Reviewed
            ON T1.Application_ID = Reviewed.Application_ID
            -- Status application Reviewed
            AND Reviewed.StatusID = 2

         LEFT JOIN dbo.ApplicationStatusHistory Rejected
            ON T1.Application_ID = Rejected.Application_ID
            -- Status application Rejected
            AND Rejected.StatusID = 3

         LEFT JOIN dbo.ApplicationStatusHistory Interview
            ON T1.Application_ID = Interview.Application_ID
            -- Status application Interviewed
            AND Interview.StatusID = 4

         LEFT JOIN dbo.ApplicationStatusHistory Hired
            ON T1.Application_ID = Hired.Application_ID
            -- Status application Hired
            AND Hired.StatusID = 5
   WHERE
      T1.ApplicationTimestamp BETWEEN '2020-01-01' AND '2020-12-31'