问题描述
它是一个状态驱动的应用程序跟踪软件。模块中的一些基本表格是:
-
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'