-1

我正在使用的查询是:

SELECT  
 a.What_Tech,  
 a.callid FirstCallid,  
 b.Callid SecondCallid,  
 a.[segStart_dateTime] FirstCallTime,  
 b.[segStart_dateTime] SecondCallTime,  
 DateDiff(second, a.[segStart_dateTime], b.[segStart_dateTime]) as [myDiff]  
FROM CallVolume.AreaGeneratedActivity a
JOIN CallVolume.AreaGeneratedActivity b on  
  a.calling_pty = b.calling_pty  
  and a.[segStart_dateTime] < b.[segStart_dateTime]  
  and dbo.getdateonly(a.segStart_dateTime) = dbo.getdateonly(b.segStart_dateTime)  
WHERE ABS(DateDiff(second, a.[segStart_dateTime], b.[segStart_dateTime])) > 60  
  and ABS(DateDiff(second, a.[segStart_dateTime], b.[segStart_dateTime])) <= 1800

返回的是:

|What_Tech|FirstCallid|SecondCallid|FirstCallTime|SecondCallTime|myDiff
| 技术1 | 21134601 | 21136023 | 09:19:41 | 09:20:43 | 62
| 技术1 | 21134601 | 21134507 | 09:19:41 | 09:19:41 | 886
| 技术1 | 21134601 | 21134602 | 09:19:41 | 09:34:27 | 887

我想要的是不同的FirstCallids:

|What_Tech|FirstCallid|SecondCallid|FirstCallTime|SecondCallTime|myDiff
| 技术1 | 21134601 | 21134676 | 09:19:41 | 09:20:43 | 62
| 技术1 | 21136023 | 21136024 | 09:34:27 | 09:35:27 | 1

以下是表中的一些示例数据:

INSERT [dbo].[TestData](callid, What_Tech, segStart_dateTime, segStop_dateTime, duration)
SELECT 21134601, N'Tech1', '20120307 09:19:41', '20120307 09:20:35', 54 UNION ALL
SELECT 21134676, N'Tech1', '20120307 09:20:43', '20120307 09:21:30', 47 UNION  ALL
SELECT 21136023, N'Tech1', '20120307 09:34:27', '20120307 09:36:54', 147 UNION ALL
SELECT 21148838, N'Tech1', '20120307 12:00:29', '20120307 12:02:05', 96 UNION ALL
SELECT 21149159, N'Tech1', '20120307 12:04:32', '20120307 12:05:46', 74 UNION ALL
SELECT 21163170, N'Tech1', '20120307 14:50:08', '20120307 14:52:36', 148

请注意,返回的示例数据和我想要的只是示例,而不是直接来自 INSERT 语句中给出的示例数据


calling_party发布的查询(一旦我删除了缺少的连接条件INSERT并将函数调用更改为内联计算)在给定提供的示例数据的情况下产生这些结果:

What_Tech  FirstCallId  SecondCallId  FirstCallTime        SecondCallTime       myDiff
---------  -----------  ------------  -------------------  -------------------  ------
Tech1      21134601     21134676      2012-03-07 09:19:41  2012-03-07 09:20:43  62
Tech1      21134601     21136023      2012-03-07 09:19:41  2012-03-07 09:34:27  886
Tech1      21134676     21136023      2012-03-07 09:20:43  2012-03-07 09:34:27  824
Tech1      21148838     21149159      2012-03-07 12:00:29  2012-03-07 12:04:32  243

鉴于此,您能否根据您提供的实际样本数据定义您期望的结果,而不是从我们看不到的一组略有不同的数据中显示所需的结果?

4

2 回答 2

2

CROSS APPLY将使联接只取第一行,b7从而消除您面临的重复问题。但!如果您允许calling_pty 的第三次调用表示为对(second_call,third_call),这只会产生令人满意的结果,即SecondCall 可以是其他行中的FirstCall。如果您想在第二次之后消除所有呼叫,您将需要不同的方法。

这是 Sql Fiddle DEMO 版本。

select 
    a.What_Tech,  
    a.callid FirstCallid,  
    b.Callid SecondCallid,  
    a.[segStart_dateTime] FirstCallTime,  
    b.[segStart_dateTime] SecondCallTime,  
    DateDiff(second, a.[segStart_dateTime], b.[segStart_dateTime]) as [myDiff]  
  from testdata a
 cross apply
 (
   select top 1
       CallId,
       [segStart_dateTime]
     from testdata
  -- Filtering by a.calling_pty is missing 
    where testdata.segStart_dateTime > dateadd (second, 60, a.segStart_dateTime)
      and testdata.segStart_dateTime <= dateadd (second, 1800, a.segStart_dateTime)
    order by testdata.segStart_dateTime
) b
于 2012-05-30T23:09:17.520 回答
0

例如,您可以选择GROUP BY第一个呼叫 ID(以及您要选择的仅与第一个呼叫 ID 关联的所有列),然后选择MIN(b.callid). 但是,您将需要从这个最小的第二个调用 ID 进行子查询或进一步连接,以达到第二个调用 ID 的任何属性,因为从逻辑上讲,第一个调用不会唯一标识第二个调用。

于 2012-05-30T22:11:01.503 回答