2017-09-27 13 views
0

私は、特定の日の拡張子間の親子関係を決定するシナリオを(SQL Server 2012で)持っています。私は、マスターレコード(すなわち、Start CallerIDおよびnextCallerID(転送))、サブレコードおよび終了レコード(すなわち、終了CallID)を識別できるフォーマットにデータを取得することができました。下の表を参照してください。レベルを繰り返すことができる親子関係の検索

問題は、任意のCallIDまたはNextCallIDを、Master、Sub、またはEndコールと同じ日に後で繰り返すことができることです。基本的に正しいコールグループを見つけなければならず、マスターCallIDはグループごとに繰り返さなければなりません。また、呼び出しを何度も転送することができます。つまり、多くのSubレコードを持つことができます。

データ:

Timestamp    | CallID  | NextCallID | Type 
------------------------|-------------|-------------|----- 
2017-07-26 14:37:24.000 | 37468024 | 37594497 | M 
2017-07-26 14:51:27.000 | 37594497 | 37595080 | S 
2017-07-26 14:59:30.000 | 37595080 | 37512345 | S 
2017-07-26 14:59:59.000 | 37512345 | NULL  | E 
2017-07-26 18:59:59.000 | 37594497 | NULL  | M 

望ましい結果:

Timestamp    | MasterCallID | CallID | NextCallID | Type 
------------------------|------------- |-----------|------------|------- 
2017-07-26 14:37:24.000 | 37468024  | 37468024 | 37594497 | Master 
2017-07-26 14:51:27.000 | 37468024  | 37594497 | 37595080 | Sub/transfer 
2017-07-26 14:59:30.000 | 37468024  | 37595080 | 37512345 | Sub/transfer 
2017-07-26 14:59:59.000 | 37468024  | 37512345 | NULL  | End Call 
2017-07-26 18:59:59.000 | 37594497  | 37594497 | NULL  | Master 

あなたは上記の設定データからわかるように、CallID 37594497は、マスタレコードに子供だったし、その後の日中でした新しい記録/呼び出しのマスター。

問題のステートメント/テーブル形式が不明な場合にお詫び申し上げます。 この点に関するご支援をいただければ幸いです。


改正:

提案されたソリューションは、次のようなシナリオでは動作しません:

データ:(CTEクエリを使用して)

Timestamp    | CallID  | NextCallID | Type 
    ------------------------|-------------|-------------|----- 
    2017-07-26 07:08:32.000 | 37461343 | 37565836 | M 
    2017-07-26 07:31:06.000 | 37565804 | 37565938 | M 
    2017-07-26 07:35:23.000 | 37565836 | 37565909 | S 
    2017-07-26 07:42:23.000 | 37565909 | NULL  | E 
    2017-07-26 07:45:04.000 | 37565938 | 37566044 | S 
    2017-07-26 07:52:59.000 | 37566044 | NULL  | E 
    2017-07-26 18:14:26.000 | 37565461 | 37565909 | M 
    2017-07-26 18:24:48.000 | 37565804 | NULL  | M 
    2017-07-26 18:26:11.000 | 37565836 | NULL  | M 
    2017-07-26 18:29:23.000 | 37565909 | 37566044 | S 
    2017-07-26 18:30:06.000 | 37565938 | NULL  | M 
    2017-07-26 18:33:11.000 | 37566044 | NULL  | E 

出力:

Timestamp    | MasterCallID| CallID  | NextCallID | Type 
    ------------------------|-------------|-------------|---------------|------- 
    2017-07-26 07:08:32.000 | 37461343 | 37461343 | 37565836  | M 
    2017-07-26 07:31:06.000 | 37565804 | 37565804 | 37565938  | M 
    2017-07-26 07:35:23.000 | 37461343 | 37565836 | 37565909  | S 
    2017-07-26 07:42:23.000 | 37461343 | 37565909 | NULL   | E 
    2017-07-26 07:42:23.000 | 37565461 | 37565909 | NULL   | E 
    2017-07-26 07:45:04.000 | 37565804 | 37565938 | 37566044  | S 
    2017-07-26 07:52:59.000 | 37461343 | 37566044 | NULL   | E 
    2017-07-26 07:52:59.000 | 37565461 | 37566044 | NULL   | E 
    2017-07-26 07:52:59.000 | 37565804 | 37566044 | NULL   | E 
    2017-07-26 18:14:26.000 | 37565461 | 37565461 | 37565909  | M 
    2017-07-26 18:24:48.000 | 37565804 | 37565804 | NULL   | M 
    2017-07-26 18:26:11.000 | 37565836 | 37565836 | NULL   | M 
    2017-07-26 18:29:23.000 | 37461343 | 37565909 | 37566044  | S 
    2017-07-26 18:29:23.000 | 37565461 | 37565909 | 37566044  | S 
    2017-07-26 18:30:06.000 | 37565938 | 37565938 | NULL   | M 
    2017-07-26 18:33:11.000 | 37461343 | 37566044 | NULL   | E 
    2017-07-26 18:33:11.000 | 37565461 | 37566044 | NULL   | E 
    2017-07-26 18:33:11.000 | 37565804 | 37566044 | NULL   | E 

所望の出力:

Timestamp    | MasterCallID| CallID  | NextCallID | Type 
    ------------------------|-------------|-------------|---------------|------- 
    2017-07-26 07:08:32.000 | 37461343 | 37461343 | 37565836  | M 
    2017-07-26 07:35:23.000 | 37461343 | 37565836 | 37565909  | S 
    2017-07-26 07:42:23.000 | 37461343 | 37565909 | NULL   | E 
    2017-07-26 07:31:06.000 | 37565804 | 37565804 | 37565938  | M 
    2017-07-26 07:45:04.000 | 37565804 | 37565938 | 37566044  | S 
    2017-07-26 07:52:59.000 | 37565804 | 37566044 | NULL   | E 
    2017-07-26 18:14:26.000 | 37565461 | 37565461 | 37565909  | M 
    2017-07-26 18:29:23.000 | 37565461 | 37565909 | 37566044  | S 
    2017-07-26 18:33:11.000 | 37565461 | 37566044 | NULL   | E 
    2017-07-26 18:26:11.000 | 37565836 | 37565836 | NULL   | M 

が大幅にご協力をお願い申し上げます。

よろしく

+0

「提案されたソリューションは、次のシナリオでは機能しません」。元のシナリオを変更しました。だから、私はあなたが元のクエリに対応している場合は、投票にすべきだと思います。その後、私たちはこの新しい要求に対してお手伝いします。 – etsa

+0

PlsはS.O.テキストの書式設定を学びます。次に、あなたの "新しい"質問に尋ねたものの簡単な説明を追加して、あなたの努力を示します(この場合、回答の質問から新しい要求を解決しようとしたことは何ですか?) – etsa

+0

私は取り組んでいますそれは非常に簡単ではありません(少なくとも現時点でそうそうです...) – etsa

答えて

0

より良いあなたの要件を読んで、私はあなたが再帰クエリ(CTE)を使用することがあると思います。再帰部分では、すべての階層を抽出します。私は最後の列(M2)でマスターコールを追跡します。

このクエリは、以前の回答と同じように、コールの時間順に基づいていません。これは、CallIDとNextCallIDだけを使用して動作するので、同じ時間を使用してコールの階層を持つこともできます。

;WITH A AS (SELECT Timestamp,CallID,NextCallID,Type, CallID AS MasterCallID 
      FROM CALLS WHERE TYPE='M' 
      UNION ALL 
      SELECT B.Timestamp,B.CallID,B.NextCallID,B.Type, A.MasterCallID 
      FROM CALLS B 
      INNER JOIN A ON A.NEXTCALLID=B.CALLID 
      WHERE B.TYPE<>'M') 
SELECT Timestamp 
     , MasterCallID 
     , CallID 
     , NextCallID 
     , CASE Type WHEN 'M' Then 'Master' WHEN 'S' THEN 'Sub/Transfer' WHEN 'E' THEN 'End Call' ELSE '' END AS Type 
FROM A 
ORDER BY TIMESTAMP 

出力:新しいサンプルデータと

; WITH A AS (SELECT Timestamp,CallID,NextCallID,Type, CallID AS MasterCallID, Timestamp AS TIMEMASTER 
      FROM CALLS WHERE TYPE='M' 
      UNION ALL 
      SELECT B.Timestamp,B.CallID,B.NextCallID,B.Type, A.MasterCallID, A.TIMEMASTER 
      FROM CALLS B 
      INNER JOIN A ON B.CALLID=A.NEXTCALLID AND B.TIMESTAMP>A.TIMESTAMP   
      WHERE B.TYPE<>'M') 
SELECT A.Timestamp 
     , A.MasterCallID 
     , A.CallID 
     , A.NextCallID 
     , CASE A.Type WHEN 'M' Then 'Master' WHEN 'S' THEN 'Sub/Transfer' WHEN 'E' THEN 'End Call' ELSE '' END AS Type 
FROM A 
INNER JOIN (SELECT TIMESTAMP, CALLID, MAX(TIMEMASTER) MAXTIMEM FROM A GROUP BY TIMESTAMP, CALLID) C ON A.TIMESTAMP=C.TIMESTAMP AND A.CALLID=C.CALLID AND A.TIMEMASTER = C.MAXTIMEM 
ORDER BY TIMEMASTER, TIMESTAMP 
; 

出力:

+-------------------------+------------+----------+------------+--------------+ 
|  Timestamp  | MASTERCALL | CallID | NextCallID |  Type  | 
+-------------------------+------------+----------+------------+--------------+ 
| 2017-07-26 14:37:24.000 | 37468024 | 37468024 | 37594497 | Master  | 
| 2017-07-26 14:51:27.000 | 37468024 | 37594497 | 37595080 | Sub/Transfer | 
| 2017-07-26 14:59:30.000 | 37468024 | 37595080 | 37512345 | Sub/Transfer | 
| 2017-07-26 14:59:59.000 | 37468024 | 37512345 | NULL  | End Call  | 
| 2017-07-26 18:59:59.000 | 37594497 | 37594497 | NULL  | Master  | 
+-------------------------+------------+----------+------------+--------------+ 

新バージョン質問編集(間違った "リンク" を作成することができ、クエリの上にコールmastercall)の後に:

Timestamp    MasterCallID CallID  NextCallID Type 
------------------------ ------------- ------------- ------------- ------------ 
2017-07-26 07:08:32.000 37461343  37461343  37565836  Master 
2017-07-26 07:35:23.000 37461343  37565836  37565909  Sub/Transfer 
2017-07-26 07:42:23.000 37461343  37565909  NULL   End Call 
2017-07-26 07:31:06.000 37565804  37565804  37565938  Master 
2017-07-26 07:45:04.000 37565804  37565938  37566044  Sub/Transfer 
2017-07-26 07:52:59.000 37565804  37566044  NULL   End Call 
2017-07-26 18:14:26.000 37565461  37565461  37565909  Master 
2017-07-26 18:29:23.000 37565461  37565909  37566044  Sub/Transfer 
2017-07-26 18:33:11.000 37565461  37566044  NULL   End Call 
2017-07-26 18:24:48.000 37565804  37565804  NULL   Master 
2017-07-26 18:26:11.000 37565836  37565836  NULL   Master 
2017-07-26 18:30:06.000 37565938  37565938  NULL   Master 
+0

感謝etsa、私はそれをより多くの順列で行って、それが動作するかどうかを知らせます。 – solidawe

+0

@Wazimh数分後に別のクエリを投稿します。私はこの後者があなたの要求に最も適していると思います。 – etsa

+0

@Wazimhは私の更新された答えを見てください。 – etsa

0

あなたはOVERSUMを使用して、あなたの最初のクエリでgroupingの要素を試すことができます。各グループを知る

DECLARE @DataSource TABLE 
(
    [Timestamp] DATETIME2 
    ,[CallID] BIGINT 
    ,[NextCallID] BIGINT 
    ,[Type] CHAR(1) 
); 

INSERT INTO @DataSource ([Timestamp], [CallID], [NextCallID], [Type]) 
VALUES ('2017-07-26 14:37:24.000', 37468024, 37594497, 'M') 
     ,('2017-07-26 14:51:27.000', 37594497, 37595080, 'S') 
     ,('2017-07-26 14:59:30.000', 37595080, 37512345, 'S') 
     ,('2017-07-26 14:59:59.000', 37512345, NULL, 'E') 
     ,('2017-07-26 18:59:59.000', 37594497, NULL, 'M'); 

SELECT * 
     ,SUM(IIF([Type] = 'M', 1, 0)) OVER (ORDER BY [Timestamp] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Group] 
FROM @DataSource 
ORDER BY [Timestamp] ASC; 

enter image description here

たちはTypeは、各グループのMで見つけCallIDにのみ必要です呼び出します。

WITH DataSource AS 
(
    SELECT * 
      ,SUM(IIF([Type] = 'M', 1, 0)) OVER (ORDER BY [Timestamp] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Group] 
    FROM @DataSource 
) 
SELECT * 
     ,MAX(IIF([Type] = 'M', [CallID], NULL)) OVER (PARTITION BY [Group]) 
FROM DataSource 
ORDER BY [Timestamp] ASC; 

enter image description here

+0

gotqnに感謝します。あなたのソリューションはこのデータセットでも動作します。私の唯一の懸案事項は、生産ではるかに大きなデータセットを使用する場合にのみ、timeStampでグループ化することです。これをテストし、フィードバックを提供します。 – solidawe

+0

クエリがいくつかのシナリオで動作しなくなりました。上記の私の質問の修正を見てください。感謝します。 – solidawe