-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
| Tech1 | 21134601 | 21136023 | 09:19:41 | 09:20:43 | 62
| Tech1 | 21134601 | 21134507 | 09:19:41 | 09:19:41 | 886
| Tech1 | 21134601 | 21134602 | 09:19:41 | 09:34:27 | 887

私が欲しいのは異なるFirstCallidsです:

| What_Tech | FirstCallid | SecondCallid | FirstCallTime | SecondCallTime | myDiff
| Tech1 | 21134601 | 21134676 | 09:19:41 | 09:20:43 | 62
| Tech1 | 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の3番目の呼び出しをペア(second_call、third_call)として表すことを許可した場合にのみ、満足のいく結果を生成します。つまり、SecondCallは他の行のFirstCallになることができます。1秒後にすべての呼び出しを排除したい場合は、別のアプローチが必要になります。

これがSQLフィドルデモバージョンです。

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)。ただし、論理的には、最初の呼び出しは2番目の呼び出しを一意に識別しないため、2番目の呼び出しIDのプロパティに到達するには、この最小の2番目の呼び出しIDからのサブクエリまたは追加の結合が必要になります。

于 2012-05-30T22:11:01.503 に答える