0

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

  • 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, 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
4

1 回答 1

0

在不了解更多数据结构的情况下,您似乎有一些状态字段,用于识别收到的申请数据的“阶段”以安排面试。您可能希望根据每个相应的“状态”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, 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'
于 2021-06-22T16:38:30.130 回答