SQL查询跟踪性能的时差

SQL query for time difference for tracking performance

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

我想检查处理新申请的效率,并要求提供一份报告,说明申请在进入第二状态(它对于 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, T2.StatusTimeStamp, T1.ApplicationTimestamp) AS 'Processing Time (Hours)',
    DATEDIFF(MINUTE, T2.StatusTimeStamp, 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 对根 table 执行多个 JOIN。

因此,假设您的状态代码具有一些连续的序列上下文

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

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

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, now() ),
                    coalesce( Reviewed.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'