4

我在这里找到了类似但不完全匹配的场景,并且没有任何运气让它发挥作用。如果这是一个重复的问题,请原谅我,我肯定是先搜索的!我有三张桌子。第一个,A,是帮助台票的列表。第二个,B,时间条目列表。第三个,C,关于第二个中时间条目的更多详细信息。对于 A 中的每个项目,B 中可以有多个项目,但对于 B 中的每个项目,C 中只有且恰好一个条目。

wh_task 作为 A

task_id   create_time              source_id   
========  ============             ==========  
1351000   2013-01-23 12:03:23.590  8          
1351001   2013-01-23 13:03:23.590  5
1351002   2013-01-23 15:03:23.590  8

wh_time_item 为 B

task_id   time_item_id   created_by_user_id
========  ============   =================
1351000   2456           1234567
1351000   2457           2345786
1351000   2458           1234567

wh_time_subitem 为 C

time_item_id  create_time              
========      ============             
2456          2013-01-23 12:43:23.590
2457          2013-01-25 13:13:23.590
2458          2013-02-12 16:03:23.590

高级目标 - 在给定的日期范围内,由工程师确定每个工单的平均 FIRST 响应时间。

具体来说 - 首先,查找 A 中在 @StartDate 和 @EndDate 之间创建的所有项目。接下来,在 A 中找到 source_id = 8 的所有项目(这些是我关心的唯一票证)。然后,我需要找到 B 中的哪个项目是“第一个”条目,即最接近 A 中项目创建的日期。虽然表 B 没有创建日期 - 那是在 C 中。一旦我确定B 中“第一个”的项目,我需要查看 created_by_user_id 是否与 @Engineer 匹配。最后,我想要所有匹配项的 a.create_time 和 c.create_time 之间的日期差异的平均值,以分钟为单位。像 AVERAGE(DATEDIFF(MI, a.create_time, c.createtime) 作为响应时间。

在过去的两天里,我经历了十几次迭代,这是我现在的错误查询。我知道这个查询,即使它可以运行,也不会给我想要的东西 - 一直在摆弄它来拉出额外的列以进行故障排除:

DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Engineer integer
SET @StartDate = '04/01/13'
SET @EndDate = '04/30/13 23:59:59'
SET @StartDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @StartDate)
SET @EndDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @EndDate)
SET @Engineer = 1234567

SELECT [task_number]
      ,a.[create_time]
      ,DateDiff(MI, a.create_time, c.create_time) as a_responsetime
      ,b.user_id
      ,c.[time_subitem_id]
      ,a.ticket_source_id
  FROM [databasename].[dbo].[wh_task] as a
LEFT JOIN [databasename].[dbo].[wh_time_item] AS b
  ON a.task_id = b.task_id
LEFT JOIN [[databasename].[dbo].[wh_time_subitem] AS c
  ON b.time_item_id = (SELECT c.time_item_id from [databasename].[dbo].[wh_time_subitem] WHERE c.create_time = (SELECT MIN(c.create_time) from [databasename].[dbo].[wh_time_subitem]))
WHERE 
  b.user_id = @Engineer
  AND a.ticket_source_id = 8
  AND c.create_time between @StartDate and @EndDate
  ORDER BY a.ticket_source_id

提前感谢您提供的任何帮助。我充其量只是一个 SQL 爱好者,所以不要担心伤害我的感情。:-)

4

2 回答 2

1

Jazz,跟进我发送给您的电子邮件,根据您提供的示例数据使用以下内容,我得到了我认为您正在寻找的正确数据点:

declare @StartDate datetime
declare @EndDate datetime
declare @Engineer int

SET @StartDate = '01/01/13'
SET @EndDate = '01/30/13 23:59:59'
SET @StartDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @StartDate)
SET @EndDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @EndDate)
SET @Engineer = 1234567

select AVG(first_response_time) from ( select A.*, DATEDIFF(minute, A.create_time, (
    select top 1 C.create_time
    from wh_time_item as B
        inner join wh_time_subitem as C on C.time_item_id = B.time_item_id
    order by C.create_time asc ) ) as first_response_time
from wh_task as A
    inner join wh_time_item as B on B.task_id = A.task_id
where A.source_id = 8
    and A.create_time between @StartDate and @EndDate
    and B.created_by_user_id = @Engineer
 ) as first_response_table

请注意,针对 wh_time_item 和 wh_time_subitem 的子查询假定 create_time 将始终在 wh_task create_time 上或之后... 这似乎是一个可靠的假设。

于 2013-06-04T11:40:04.167 回答
0

你确定你在使用上面的这个查询吗?

你知道的朋友...当您在语句中直接使用aggregate functionlike时会发生此错误。像这样 :AVG()ON clause

TableA join TableB on TableA.Code >= AVG(TableB.Code) 

上面的这个查询有一个像你一样的错误

但是现在您通过aggregate functionin 使用子查询,这似乎是真的。我的意思是您查询的这一部分:

LEFT JOIN [[databasename].[dbo].[wh_time_subitem] AS c
ON b.time_item_id = (SELECT c.time_item_id from [databasename].[dbo].[wh_time_subitem] WHERE c.create_time = (SELECT MIN(c.create_time) from [databasename].[dbo].[wh_time_subitem]))

看看这个链接:链接可能会有所帮助

于 2013-05-31T10:26:07.917 回答