对于所有 SQL Server 视图专家来说,这似乎是一个蹩脚的问题,但是......
所以我有我的客户需要用于报告目的的一小组数据。我不得不承认,虽然我确实询问了他们的报告要求,但直到现在我才发现我的数据库可以得到更好的优化。
他们想要的数据之一是可能已经运行的两个任务之间的时间差:
select caseid, hy.createdate
from app_history hy
where hy.activityid in (303734, 303724)
这给了我每个案例提交的两行(编辑后),然后必须对其进行测量;但有一些摆动:活动 303734 将始终运行,活动 303724 可能会运行。每个 303734 和 303724 组合匹配。可以想象,在第二次提交之后,一个案例可以有 1 个不匹配的 303734 和一个匹配的对。匹配这些可能取决于直觉。不好。每个 caseid 可能有多个提交,如果是这种情况,那么这两个活动将在以后的每次运行。无法将提交编号写入此表。
app_history 表保存 userid、caseid 和 activityid 作为外键。PK 是标识列 ID。
有没有更好的方法来编写查询?
在 KM 的帮助下:
select
c.id, c.submissionno, hya.caseid, hya.createtime, hyb.caseid, hyb.createtime
,CASE
WHEN hyb.caseid IS NOT NULL THEN DATEDIFF(mi,hya.createtime,hyb.createtime)
ELSE NULL
END AS Difference
from app_case c
inner join app_history hya on c.id = hya.caseid
left outer join app_history hyb on c.id = hyb.caseid
where hya.activityid in (303734) and hyb.activityid in (303724) order by c.id asc
这几乎可以工作。
我现在有这个问题:
460509|2|460509|15:15:39.000|460509|15:16:13.000|1
460509|2|460509|15:15:39.000|460509|15:18:13.000|3
460509|2|460509|15:17:52.000|460509|15:16:13.000|-1
460509|2|460509|15:17:52.000|460509|15:18:13.000|1
所以我现在得到 1 行,比较四行中的每一行……嗯,我认为这是我所希望的最好的。:(