2

私のクエリは常に重複した結果を生成します。100 万行を超えるデータベースでこのクエリをトラブルシューティングするにはどうすればよいですか。

Select segstart
    ,segment
    ,callid
    ,Interval
    ,dialed_num
    ,FiscalMonthYear
    ,SegStart_Date
    ,row_date
    ,Name
    ,Xferto
    ,TransferType
    ,Agent
    ,Sup
    ,Manager
    ,'MyCenter' = Case Center
When 'Livermore Call Center' Then 'LCC'
When 'Natomas Call Center' Then 'NCC'
When 'Concord Call Center' Then 'CCC'
When 'Virtual Call Center' Then 'VCC'
When 'Morgan Hill Call Center' Then 'MHCC'
Else Center
End
    ,Xferfrom
    ,talktime
    ,ANDREWSTABLE.transferred
    ,ANDREWSTABLE.disposition
    ,dispsplit
    ,callid
    ,hsplit.starttime
    ,CASE
    WHEN hsplit.callsoffered > 0 
    THEN (CAST(hsplit.acceptable as DECIMAL)/hsplit.callsoffered)*100
    ELSE '0'
    END AS 'Service Level'
    ,hsplit.callsoffered
    ,hsplit.acceptable
FROM
(
Select segstart,
    100*DATEPART(HOUR, segstart) + 30*(DATEPART(MINUTE, segstart)/30) as Interval,
    FiscalMonthYear,
    SegStart_Date,
    dialed_num,
    callid,
    Name,
    t.Queue AS 'Xferto',
    TransferType,
    RepLName+', '+RepFName AS Agent,
    SupLName+', '+SupFName AS Sup,
    MgrLName+', '+MgrFName AS Manager,
    q.Center,
    q.Queue AS 'Xferfrom',
    e.anslogin,
    e.origlogin,
    t.Extension,
    transferred,
    disposition,
    talktime,
    dispsplit,
    segment
From CMS_ECH.dbo.CaliforniaECH e

INNER JOIN Cal_RemReporting.dbo.TransferVDNs t on e.dialed_num = t.Extension
INNER JOIN InfoQuest.dbo.IQ_Employee_Profiles_v3_AvayaId q on e.origlogin = q.AvayaID
INNER JOIN Cal_RemReporting.dbo.udFiscalMonthTable f on e.SegStart_Date = f.Tdate

Where SegStart_Date between getdate()-90 and getdate()-1
    And q.Center not in ('Collections Center',
                         'Cable Store',
                         'Business Services Center',
                         'Escalations')
    And SegStart_Date between RepToSup_StartDate and RepToSup_EndDate
    And SegStart_Date between SupToMgr_StartDate and SupToMgr_EndDate
    And SegStart_Date between Avaya_StartDate and Avaya_EndDate
    And SegStart_Date between RepQueue_StartDate and RepQueue_EndDate
    AND (e.transferred like '1'
    OR e.disposition like '4') order by segstart
) AS ANDREWSTABLE

--Left Join CMS_ECH.dbo.hsplit hsplit on hsplit.starttime = ANDREWSTABLE.Interval and hsplit.row_date = ANDREWSTABLE.SegStart_Date and ANDREWSTABLE.dispsplit = hsplit.split
4

2 に答える 2

6

2つの可能性があります:

  1. システムに複数のレコードがあり、プロジェクションがそれらを区別するのに十分な列を選択しないか、where句がそれらを除外しないため、結果セットに重複する行が生成されるように見えます。
  2. ON句が完全ではないため、結合によって偽の重複が生成されています。

これらの両方は、必要なレベルのドメイン知識を持つ誰かによってのみ解決することができます。したがって、そのクエリを修正するつもりはありません。ごめん。

あなたがする必要があるのは、いくつかの重複した結果といくつかの重複しない結果を同一視し、最初のグループが共通して持っているものを発見することです。これは、2番目のグループとも区別されます。

特に何百万もの行があるので、簡単だと言っているのではありません。しかし、それが簡単であるならば、それはする価値がないでしょう。

于 2010-07-17T05:28:17.220 に答える
3

私はこれに数回参加しましたが、それは常に私の結合ステートメントの1つになります。一度に1つずつ結合ステートメントを削除して、そのうちの1つを削除すると重複の数が減るかどうかを確認します。

他のオプションは、重複する行のセットを見つけて、結合値の結合内の各テーブルにクエリを実行し、何が返されるかを確認することです。

また、実行しているデータベースとバージョンは何ですか?

于 2010-07-17T05:19:32.510 に答える