Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*DECLARE @DATE_START datetime = '20190729 00:00'
- DECLARE @DATE_END datetime = '20190731 23:59'
- DECLARE @TASKS TABLE(Id uniqueidentifier)
- INSERT INTO @TASKS
- SELECT id
- FROM [oktell_settings].[dbo].[A_TaskManager_Tasks]
- DECLARE @OPERATORS TABLE(Id uniqueidentifier)
- INSERT INTO @OPERATORS
- SELECT Id
- FROM [oktell_settings].[dbo].[A_Users]*/
- ----------------------------------------------------------------------------------
- -----ФИЛЬТРУЕМ СТАРТОВУЮ ТАБЛИЦУ--------------------------------------------------
- DECLARE @FilteredTable TABLE (UserId uniqueidentifier, [State] int, TimeStart datetime, LenTime int, ICode int)
- INSERT INTO @FilteredTable
- SELECT IdOperator
- , [State]
- , DateTimeStart
- , CAST(LenTime as int)
- , ICode
- FROM [oktell_cc_temp].[dbo].[A_Cube_CC_OperatorStates]
- WHERE DateTimeStart BETWEEN @DATE_START AND @DATE_END
- AND IdTask IN (SELECT * FROM @TASKS)
- AND IdOperator IN (SELECT * FROM @OPERATORS)
- --------------------------------------------------------------------------------------
- ----ФИЛЬТРУЕМ ВХОДЯЩИЕ ЗВОНКИ---------------------------------------------------------
- DECLARE @FilteredEffort TABLE(OperId uniqueidentifier, LenTime int, CallResult int, Abonent nvarchar(20))
- INSERT INTO @FilteredEffort
- SELECT IdOperator
- , CAST(LenTime as int)
- , CallResult
- , AbonentNumber
- FROM [oktell_cc_temp].[dbo].[A_Cube_CC_EffortConnections]
- WHERE DateTimeStart BETWEEN @DATE_START AND @DATE_END
- AND IdTask IN (SELECT * FROM @TASKS)
- AND IdOperator IN (SELECT * FROM @OPERATORS)
- ---------ИЗВЛЕКАЕМ УСПЕШНЫЕ ВХОДЯЩИЕ ЗВОНКИ------------------------------------------------------
- DECLARE @SuccessIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int, AvgTime int)
- INSERT INTO @SuccessIncom
- SELECT OperId
- , COUNT(OperId)
- , SUM(LenTime)
- , CAST(AVG(LenTime) as int)
- FROM @FilteredEffort
- WHERE CallResult = 5
- GROUP BY OperId
- -----------------------------------------------------------------------------------------
- ------ИЗВЛЕКАЕМ ПРОПУЩЕННЫЕ ВХОДЯЩИЕ ЗВОНКИ-------------------------------------------------------
- DECLARE @FailedIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int)
- INSERT INTO @FailedIncom
- SELECT OperId
- , COUNT(OperId)
- , SUM(LenTime)
- FROM @FilteredEffort
- WHERE CallResult != 5
- GROUP BY OperId
- -----------------------------------------------------------------------------------------
- ---------ИЗВЛЕКАЕМ ВСЕ ВХОДЯЩИЕ ЗВОНКИ------------------------------------------------------
- DECLARE @AllIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int)
- INSERT INTO @AllIncom
- SELECT OperId
- , COUNT(OperId)
- , SUM(LenTime)
- FROM @FilteredEffort
- GROUP BY OperId
- -----------------------------------------------------------------------------------------
- -----СЧИТАЕМ КОЛИЧЕСТВО КОНТАКТОВ--------------------------------------------------------
- DECLARE @Abonents2 TABLE(OperId uniqueidentifier, Abonent nvarchar(20));
- WITH Abonents1 AS
- (
- SELECT OperId, Abonent
- FROM @FilteredEffort
- )
- ----УДАЛЯЕМ ПОВТОРЯЮЩИХСЯ АБОНЕНТОВ
- INSERT INTO @Abonents2
- SELECT DISTINCT OperId, Abonent
- FROM Abonents1
- -----------------------------------
- DELETE @FilteredEffort
- DECLARE @OperContacts TABLE(OperId uniqueidentifier, AbonentCount int)
- INSERT INTO @OperContacts
- SELECT OperId, COUNT(Abonent)
- FROM @Abonents2
- GROUP BY OperId
- DELETE @Abonents2
- ----------------------------------------------------------------------------------------
- -----СЧИТАЕМ ВРЕМЯ В СИСТЕМЕ------------------------------------------------------------
- DECLARE @SystemTime TABLE(OperId uniqueidentifier, LenTime int)
- INSERT INTO @SystemTime
- SELECT UserId
- , SUM(LenTime)
- FROM @FilteredTable
- GROUP BY UserId;
- -----------------------------------------------------------------------------------------
- -----ВЫВОД РЕЗУЛЬТАТА--------------------------------------------------------------------
- SELECT OI.Name as 'Имя'
- , (SELECT [dbo].[GetTimeFromSecond](ISNULL(ST.LenTime, 0))) as 'Время в системе'
- , (SELECT [dbo].[GetTimeFromSecond](ISNULL(SI.LenTime, 0))) as 'Время разговора'
- , (SELECT [dbo].[GetTimeFromSecond](ISNULL(SI.AvgTime, 0))) as 'Среднее время разговора'
- , ISNULL(AI.[Count], 0) as 'Количество звонков'
- , ISNULL(OC.AbonentCount, 0) as 'Количество контактов'
- , ISNULL(ROUND(AI.[Count] / CAST(IIF(OC.AbonentCount != 0, OC.AbonentCount, 1) as float), 2), 0) as 'Количество звонков к контакту'
- , ISNULL(SI.[Count], 0) as 'Дозвон'
- , ISNULL(CAST(ROUND(SI.[Count] / CAST(IIF(AI.[Count] != 0, AI.[Count], 1) as float), 4) * 100 as nvarchar(10)) + '%', '0%') as 'Процент дозвона'
- FROM @SystemTime AS ST
- LEFT JOIN [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_OperatorInfo] AS OI
- ON ST.OperId = OI.Id
- LEFT JOIN @SuccessIncom as SI
- ON ST.OperId = SI.OperId
- LEFT JOIN @AllIncom as AI
- ON ST.OperId = AI.OperId
- LEFT JOIN @OperContacts as OC
- ON ST.OperId = OC.OperId
- -------------------------------------------------------------------------------------------------------
- Информацию извлекал из таблиц - EffortConnections, OperatorStates, OperatorInfo
- Удачные звонки от неудачных я отделял по таблице EffortConnections по полю CallResult
- Примерный Расчет сложности выполнения запроса:
- Размер таблицы OperatorStates = OS; EffortConnections = EC; OperatorInfo = OI
- Размеры фильтров - Дата = d; Таски = t; Операторы = op
- Fa - сложность функции подсчета среднего
- Fs - сложность функции подсчета суммы
- Fsec - сложность функции получения секунд от времени
- Fcast, F/
- Join - сложность джойна одной ячейки
- Знак равно задает приблизительное соответсвие
- 1.) FilteredTable
- Сложность построения = O(OS * t * op)
- Длина = O(d)
- 2.) FilteredEffort
- Сложность построения = O(EC * t * op)
- Длина = O(d)
- 3.) SuccessIncom
- Сложность построения = FE * (op + Fs * op + Fa * op) = 3 * O(d) * O(op) = O(d * op)
- Длина = O(d / (2 * op)
- 4.) FailedIncom
- Сложность построения = FE * (op + Fs * op) = O(d * op)
- Длина = O(d / (2 * op))
- 5.) AllIncom
- Сложность построения = FE * (op + Fs * op) = O(d * op)
- Длина = O(d / op)
- 6.) Abonents1
- Сложность построения = O(d)
- Длина = O(d)
- 7.) Abonents2
- Сложность построения = O(d)
- Длина = O(d)
- 8.) OperContacts
- Сложность построения = O(d * op)
- Длина = O(d / op)
- 9.) SystemTime
- Сложность построения = O(d * op)
- Длина = O(d / op)
- 10.) FinalQuery
- Сложность построения = O[((7d + OI) / op) * Join * (3Fsec + 2F/ + 2Fcast)] примерно равно = O[(7d + OI) / op] * J
- Ответ = O
- [
- op * [d + t(EC + OS)] + [((d + OI) * J) / op]
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement