2017-08-30 59 views
0

我正在計算呼叫中心呼叫量在一週中同一天的6周移動平均值。6周在同一天的移動平均數

我的意思是相同的6前幾天(最近6個星期二,去年6個星期三等)

我有下面的代碼的工作,但不靈活可言:

SELECT 
    [ROW_DATE], 
    [DEPARTMENT_DESC], 
    [totalcalls], 
    AVG([TOTALCALLS]) OVER(ORDER BY [DEPARTMENT_DESC], 
            [ROW_DATE] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [MOVING_AVG] 
FROM 
(
    SELECT 
     [ROW_DATE] AS [ROW_DATE], 
     [DEPARTMENT_DESC] AS [DEPARTMENT_DESC], 
     SUM([CALLS_OFFERED_ACTUALS]) AS [TOTALCALLS] 
    FROM [GEMDB].[dbo].[V_PRD_ACT_HSPLIT_intradayLCWcallsTable] 
    WHERE ROW_DATE IN(CONVERT(DATE, GETDATE() - 42), CONVERT(DATE, GETDATE() - 7), CONVERT(DATE, GETDATE() - 14), CONVERT(DATE, GETDATE() - 21), CONVERT(DATE, GETDATE() - 28), CONVERT(DATE, GETDATE() - 35)) 
    AND [DEPARTMENT_DESC] = 'techops' 
    GROUP BY 
     ROW_DATE, 
     [DEPARTMENT_DESC] 
) AS tbl 
ORDER BY 
    ROW_DATE, 
    [DEPARTMENT_DESC]; 

輸出看起來是這樣的: Moving Average for August 23rd

與上面的代碼的問題是它給了我1天的一週(8月23日)的價值。 我想獲得過去7天的6周移動平均線,沒有寫入GETDATE 49次,這將是瘋狂的。

任何幫助,將不勝感激。

+0

你能告訴就像在一個模擬的Excel表格中,或者預期的輸出結果是什麼樣子? –

回答

0

我試着創建一個簡單的例子,說明你問我是否正確理解它。這使用了2周的數據,但應該適用於更大的數據集。您可以單獨運行這段代碼來測試和調整,如果它符合你要求的:

CREATE TABLE #calls 
(
    TotalCalls INT, 
    CallDate DATE 
); 

-- 2 weeks worth of calls 
INSERT INTO #calls 
(
    TotalCalls, 
    CallDate 
) 
VALUES 
(12, '20170801'), -- starts on a Tuesday 
(13, '20170802'), 
(17, '20170803'), 
(20, '20170804'), 
(4, '20170805'), 
(8, '20170806'), 
(10, '20170807'), 
(14, '20170808'), 
(18, '20170809'), 
(16, '20170810'), 
(7, '20170811'), 
(11, '20170812'), 
(19, '20170813'), 
(14, '20170814'); 

-- casts to numeric with decimal places for the average for accuracy 
-- DayName - gives the day names for grouping 
-- DayNo - gives you the day number for ordering 
-- Instances - gives you how many days were included in the average 
-- WHERE - filters to dates >= date - 42 for 6 weeks 
SELECT AVG(CAST(c.TotalCalls AS NUMERIC(5,2))) AvgCalls, 
     DATENAME(dw,c.CallDate) DayName, 
     DATEPART(dw, c.CallDate) DayNo, 
     COUNT(c.CallDate) Instances 
FROM #calls AS c 
WHERE c.CallDate > GETDATE() - 42 
GROUP BY DATENAME(dw, c.CallDate), DATEPART(dw, c.CallDate) 
ORDER BY DATEPART(dw, c.CallDate) 

產地:

AvgCalls DayName DayNo Instances 
13.500000 Sunday  1  2 
12.000000 Monday  2  2 
13.000000 Tuesday 3  2 
15.500000 Wednesday 4  2 
16.500000 Thursday 5  2 
13.500000 Friday  6  2 
7.500000 Saturday 7  2 
+1

什麼是簡單而順暢的解決方案。這工作完美無瑕。謝謝Tanner! –

0

這裏的另一種選擇......

WITH 
    cte_SixWeekCal AS (
     SELECT 
      c.WEEK_NO, 
      ROW_DATE_BEG = DATEADD(WEEK, -13 + c.WEEK_NO, CAST(GETDATE() AS DATE)), 
      ROW_DATE_END = DATEADD(WEEK, -7 + c.WEEK_NO, CAST(GETDATE() AS DATE)) 
     FROM 
      (VALUES (1), (2), (3), (4), (5), (6)) c (WEEK_NO) 
     ) 
SELECT 
    swc.WEEK_NO, 
    ROW_DATE = ROW_DATE_END, 
    ahid.DEPARTMENT_DESC. 
    ahid.MOVING_AVG 
FROM 
    cte_SixWeekCal swc 
    CROSS APPLY (
       SELECT 
        ahi.DEPARTMENT_DESC, 
        MOVING_AVG = AVG(ahi.CALLS_OFFERED_ACTUALS) 
       FROM 
        [GEMDB].dbo.V_PRD_ACT_HSPLIT_intradayLCWcallsTable ahi 
       WHERE 
        ih.InvoiceDate >= swc.ROW_DATE_BEG 
        AND ih.InvoiceDate <= swc.ROW_DATE_END 
       GROUP BY 
        ahi.DEPARTMENT_DESC 
       ) ahid;