SQL查询跟踪性能的时差
SQL query for time difference for tracking performance
它是一个状态驱动的应用程序跟踪软件。模块中的一些基本表是:
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
在不了解更多数据结构的情况下,您似乎有一些状态字段,用于标识从收到的申请中安排面试的数据的“阶段”。您可能希望根据每个相应的“状态”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'
它是一个状态驱动的应用程序跟踪软件。模块中的一些基本表是:
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
在不了解更多数据结构的情况下,您似乎有一些状态字段,用于标识从收到的申请中安排面试的数据的“阶段”。您可能希望根据每个相应的“状态”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'