2017-12-01 4 views
0

私はMySQLクエリ(以下参照)を使ってスクリプトを実行していますが、これは期待どおりに機能します。いくつかの同一のフィールド値を持つ4つのレコードのうちの1つだけを選択します

この問い合わせを行う電話システムでは、同じ通話に対して3つまたは4つのレコードが挿入されることがありますが、その理由はわかりませんが、実行時には電話ごとに1つのレコードしか必要ありません。私はこれが別のCalling_number, Start_Time, End_time, and Talk_Time_Secondsを見ることによって行われる必要があることを決めました。複製/同一の行は、これらの3つのフィールドの値が同じです。

クエリ自体は私たちが望むものであり、できるだけ再構成する必要はありませんが、これについてはいくつかの助けが必要です。

発信番号、開始時刻、終了時刻、通話時間が上記の値とまったく同じ値の場合、どのように区別する必要がありますか?

 SELECT 
      FirstN 
      , LastN 
      , Extension 
      , Recieved 
      , Recieved_Known 
      , Outbound 
      , Outbound_Known 
      , Missed_No_VM 
      , Missed_VM 
      , Missed_Known 
      , Calling_Number 
      , Called_Number 
      , Start_Time 
      , End_Time 
     , Talk_Time_Seconds 
      , Hold_Time_Seconds 

     FROM (
      SELECT 
      firstn 
      , lastn 
      , c.extension 
      , CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 'x' ELSE '' END AS Recieved 
      , case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as Recieved_Known 
      , CASE WHEN ANSWERED = 1 AND LEGTYPE1 = 1 then 'x' ELSE '' end AS Outbound 
      , case when LEGTYPE1 = 1 and FINALLYCALLEDPARTYNO = k.phone_number then 'x' ELSE '' end as Outbound_Known 
      , case when legtype1 = 2 and answered = 0 and finallycalledpartyno not like '%oice%' then 'x' ELSE '' end as Missed_No_VM 
      , case when finallycalledpartyno like '%oice%' then 'x' ELSE '' end as Missed_VM 
      , case when ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as Missed_Known 
      , a.CALLINGPARTYNO AS Calling_Number 
      , a.FINALLYCALLEDPARTYNO AS Called_Number 
      , b.starttime as Start_Time 
      , b.endtime as End_Time 
      , b.duration as Talk_Time_Seconds 
      , a.holdtimesecs as Hold_Time_Seconds 

      FROM ambition.session a 
      INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID 
      right join jackson_id.users c on a.callingpartyno = c.extension or a.finallycalledpartyno = c.extension 
      LEFT JOIN ambition.known_numbers k ON a.callingpartyno = k.phone_number 
       WHERE a.ts >= curdate() 
       and(a.CALLINGPARTYNO in (select extension from ambition.ambition_users) OR a.finallycalledpartyno IN (select extension from ambition.ambition_users)) 
      ) x 
      order by extension; 
+0

マーシャルするために、既存のデータをあなたが望むように、あなたは、重複レコードを削除するには凝集やフィルタリングのいくつかの並べ替えを行う必要があります。しかし、重複が挿入されることさえ防止するユニークなインデックスをここに提案するかもしれません(そのような挿入は失敗します)。 –

+0

残念ながら私たちはデータベースを管理していないため、このテーブルから選択しているテーブルに一意のインデックスを適用することはできません。 –

+0

サンプルテーブルのデータと予想される結果を追加します。 (あまりにも多くの時間を費やす前に、https://stackoverflow.com/help/mcveを読むことを検討してください) – jarlh

答えて

1

4列の上でROW_NUMBERパーティションを使用してみてください:

SELECT 
      FirstN 
      , LastN 
      , Extension 
      , Recieved 
      , Recieved_Known 
      , Outbound 
      , Outbound_Known 
      , Missed_No_VM 
      , Missed_VM 
      , Missed_Known 
      , Calling_Number 
      , Called_Number 
      , Start_Time 
      , End_Time 
     , Talk_Time_Seconds 
      , Hold_Time_Seconds 

     FROM (
      SELECT 
      firstn 
      , lastn 
      , c.extension 
      , CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 'x' ELSE '' END AS Recieved 
      , case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as Recieved_Known 
      , CASE WHEN ANSWERED = 1 AND LEGTYPE1 = 1 then 'x' ELSE '' end AS Outbound 
      , case when LEGTYPE1 = 1 and FINALLYCALLEDPARTYNO = k.phone_number then 'x' ELSE '' end as Outbound_Known 
      , case when legtype1 = 2 and answered = 0 and finallycalledpartyno not like '%oice%' then 'x' ELSE '' end as Missed_No_VM 
      , case when finallycalledpartyno like '%oice%' then 'x' ELSE '' end as Missed_VM 
      , case when ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as Missed_Known 
      , a.CALLINGPARTYNO AS Calling_Number 
      , a.FINALLYCALLEDPARTYNO AS Called_Number 
      , b.starttime as Start_Time 
      , b.endtime as End_Time 
      , b.duration as Talk_Time_Seconds 
      , a.holdtimesecs as Hold_Time_Seconds 
      row_number() over (partition by a.CALLINGPARTYNO,b.starttime,b.endtime,b.duration order by 1) rn 
      FROM ambition.session a 
      INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID 
      right join jackson_id.users c on a.callingpartyno = c.extension or a.finallycalledpartyno = c.extension 
      LEFT JOIN ambition.known_numbers k ON a.callingpartyno = k.phone_number 
       WHERE a.ts >= curdate() 
       and(a.CALLINGPARTYNO in (select extension from ambition.ambition_users) OR a.finallycalledpartyno IN (select extension from ambition.ambition_users)) 
      ) x 
      where rn = 1 
      order by extension; 
関連する問題