对于SQL服务器视图中的所有专家来说,这似乎是一个蹩脚的问题但是......
因此,我的客户端需要一小组数据用于报告。我不得不承认,虽然我确实问过他们的报告要求,但直到现在我才看到我的数据库可以更好地进行优化。
他们想要的一个数据是两个可能运行的任务之间的时差:
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行比较两行中的每一行... mmm我认为这是我能想到的最好的。 :(
答案 0 :(得分:1)
使用LEFT JOIN
SELECT
a.caseid, a.createdate
,b.caseid, b.createdate
,CASE
WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
ELSE NULL
END AS Difference
FROM app_history a
LEFT OUTER JOIN app_history b ON b.activityid=303724
WHERE a.activityid=303734
再过一点架构信息后,编辑 ......
SELECT
a.caseid, a.createdate
,b.caseid, b.createdate
,CASE
WHEN b.caseid IS NOT NULL THEN DATEDIFF(mi,a.createdate,b.createdate)
ELSE NULL
END AS Difference
FROM (SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303734) aa
INNER JOIN app_history a ON aa.MaxID=a.ID
LEFT OUTER JOIN a(SELECT MAX(ID) AS MaxID FROM app_history WHERE activityid=303724) bb ON 1=1
LEFT OUTER JOIN app_history b ON bb.MaxID=b.ID
答案 1 :(得分:0)
做这样的事情
select datediff(
day,
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303734),
(select isnull(hy.createdate,0) from app_history hy where hy.activityid =303724)
)