【问题标题】:SQL query for time difference for tracking performanceSQL查询时差以跟踪性能
【发布时间】:2021-09-06 04:00:00
【问题描述】:

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

  • 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

【问题讨论】:

  • 请分享预期的输出,以便我们了解您的问题。
  • 我认为你的方法行不通。您基本上需要按 application_id 排序,然后您的任何一个时间戳都是有意义的。然后,您可能希望将给定 application_id 的每一行与前一行进行比较。
  • 请提供样本数据和期望的结果。仔细检查数据库标签; dbo 通常与 SQL Server 相关联,而不是 MySQL。

标签: mysql sql dbo


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2019-09-26
    • 2011-03-30
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多