我们有一个IssueActivities
表,它包含给定IssueID的多个活动。活动包括用户条目和系统条目。有时,问题将被置于“保留”状态,在这种情况下,IssueActivities
中的系统条目就是这样(例如,“子状态”已从“工作”发生变化正在进行中')。
IssueActivities
CREATE TABLE IssueActivities(
IssueID int NOT NULL,
IssueSummary varchar(500),
IssueActivityID int NOT NULL,
IssueActivityTypeID int NOT NULL,
ActivityDate datetime NOT NULL,
TimeSpent bigint NOT NULL,
Notes text NULL,
Notify tinyint NOT NULL);
我试图编写一个SQL语句来计算问题的总运行时间。总的正常运行时间是一个问题不在' Down'州。
我创建了一个SQLFiddle来帮助查询1个问题的数据。我知道它说我使用的是SQLite(SQL.js)数据库,但它实际上是一个SQL Server 2012数据库。我无法获得他们的SQL Studio版本之一来渲染我的脚本,所以我尽我所能。
我不太确定从哪个查询开始。它可以只在一个sql语句中完成,或者光标是否必要......我不太确定。我希望可以使用sql语句来完成,因为这最终将用于采用sql语句的报告工具(而不是游标或其他sql脚本)。
**请忽略TimeSpent
栏,因为它非常不准确。
以下是数据样本:
IssueID
IssueSummary
IssueActivityID
IssueActivityTypeID
ActivityDate
TimeSpent
Notes
Notify
32144'安装软件x时,该网站收到错误消息。' 250172 16 2016-06-07 11:13:42.837 600000000'问题输入',0
32144'安装软件x时,该网站收到错误消息。' 250243 18 2016-06-08 11:13:08.877 600000000'子状态已从正在进行中更改为向下',1
32144'安装软件x时,该网站收到错误消息。' 250633 18 2016-06-09 10:02:23.623 600000000'子状态已从Down变为Hold。'
这是问题#32144的问题活动的基本样本。我希望看到的输出是:
`IssueID' '正常运行时间'
32144 24
我如何计算这是第一个问题活动记录并记录日期和时间。然后我找到了第一个有"持有"在它中并在两个日期执行一个日期,这给了我在这个时间里的时间'。我无法计算它在下降时的时间。状态。
答案 0 :(得分:1)
通常使用聚合来获取min
时间戳(创建问题时)和max
(关闭时)。如果您只想考虑特定状态更改(小提琴中的Notes
),可以使用CASE
对其进行过滤:
SELECT min(ActivityDate) start_time
, max(CASE WHEN Notes='Sub Status has changed from Work In Progress to Closed.' THEN ActivityDate END) close_time
FROM IssueActivities
GROUP BY IssueId
使用the filter
clause通常更容易理解,SQL Server(也不是SQLite)不支持。但是,只需了解一下:
SELECT min(ActivityDate) start_time
, max(ActivityDate) FILTER (WHERE Notes='Sub Status has changed from Work In Progress to Closed.') close_time
FROM IssueActivities
GROUP BY IssueId
http://sqlfiddle.com/#!5/f56bd/4
建立差异以获得持续时间应该很容易。
显然,这只会持续一段时间(例如,如果重新打开问题,它将覆盖关闭时间。)