Advertisement
WorkAkkaunt

UBER звонки АТС

Jul 31st, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 7.34 KB | None | 0 0
  1. /*DECLARE @DATE_START datetime = '20190729 00:00'
  2. DECLARE @DATE_END datetime = '20190731 23:59'
  3.  
  4. DECLARE @TASKS TABLE(Id uniqueidentifier)
  5.  
  6. INSERT INTO @TASKS
  7. SELECT id
  8. FROM [oktell_settings].[dbo].[A_TaskManager_Tasks]
  9.  
  10. DECLARE @OPERATORS TABLE(Id uniqueidentifier)
  11.  
  12. INSERT INTO @OPERATORS
  13. SELECT Id
  14. FROM [oktell_settings].[dbo].[A_Users]*/
  15. ----------------------------------------------------------------------------------
  16.  
  17. -----ФИЛЬТРУЕМ СТАРТОВУЮ ТАБЛИЦУ--------------------------------------------------
  18. DECLARE @FilteredTable TABLE (UserId uniqueidentifier, [State] int, TimeStart datetime, LenTime int, ICode int)
  19.  
  20. INSERT INTO @FilteredTable
  21. SELECT IdOperator
  22.     , [State]
  23.     , DateTimeStart
  24.     , CAST(LenTime as int)
  25.     , ICode
  26. FROM [oktell_cc_temp].[dbo].[A_Cube_CC_OperatorStates]
  27. WHERE DateTimeStart BETWEEN @DATE_START AND @DATE_END
  28.     AND IdTask IN (SELECT * FROM @TASKS)
  29.     AND IdOperator IN (SELECT * FROM @OPERATORS)
  30. --------------------------------------------------------------------------------------
  31.  
  32. ----ФИЛЬТРУЕМ ВХОДЯЩИЕ ЗВОНКИ---------------------------------------------------------
  33. DECLARE @FilteredEffort TABLE(OperId uniqueidentifier, LenTime int, CallResult int, Abonent nvarchar(20))
  34.  
  35. INSERT INTO @FilteredEffort
  36. SELECT IdOperator
  37.     , CAST(LenTime as int)
  38.     , CallResult
  39.     , AbonentNumber
  40. FROM [oktell_cc_temp].[dbo].[A_Cube_CC_EffortConnections]
  41. WHERE DateTimeStart BETWEEN @DATE_START AND @DATE_END
  42.     AND IdTask IN (SELECT * FROM @TASKS)
  43.     AND IdOperator IN (SELECT * FROM @OPERATORS)
  44.  
  45. ---------ИЗВЛЕКАЕМ УСПЕШНЫЕ ВХОДЯЩИЕ ЗВОНКИ------------------------------------------------------
  46. DECLARE @SuccessIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int, AvgTime int)
  47.  
  48. INSERT INTO @SuccessIncom
  49. SELECT OperId
  50.     , COUNT(OperId)
  51.     , SUM(LenTime)
  52.     , CAST(AVG(LenTime) as int)
  53. FROM @FilteredEffort
  54. WHERE CallResult = 5
  55. GROUP BY OperId
  56. -----------------------------------------------------------------------------------------
  57.  
  58. ------ИЗВЛЕКАЕМ ПРОПУЩЕННЫЕ ВХОДЯЩИЕ ЗВОНКИ-------------------------------------------------------
  59. DECLARE @FailedIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int)
  60.  
  61. INSERT INTO @FailedIncom
  62. SELECT OperId
  63.     , COUNT(OperId)
  64.     , SUM(LenTime)
  65. FROM @FilteredEffort
  66. WHERE CallResult != 5
  67. GROUP BY OperId
  68. -----------------------------------------------------------------------------------------
  69.  
  70. ---------ИЗВЛЕКАЕМ ВСЕ ВХОДЯЩИЕ ЗВОНКИ------------------------------------------------------
  71. DECLARE @AllIncom TABLE(OperId uniqueidentifier, [Count] int, LenTime int)
  72.  
  73. INSERT INTO @AllIncom
  74. SELECT OperId
  75.     , COUNT(OperId)
  76.     , SUM(LenTime)
  77. FROM @FilteredEffort
  78. GROUP BY OperId
  79. -----------------------------------------------------------------------------------------
  80.  
  81. -----СЧИТАЕМ КОЛИЧЕСТВО КОНТАКТОВ--------------------------------------------------------
  82. DECLARE @Abonents2 TABLE(OperId uniqueidentifier, Abonent nvarchar(20));
  83.  
  84. WITH Abonents1 AS
  85. (
  86.     SELECT OperId, Abonent
  87.     FROM @FilteredEffort
  88. )
  89.  
  90. ----УДАЛЯЕМ ПОВТОРЯЮЩИХСЯ АБОНЕНТОВ
  91. INSERT INTO @Abonents2
  92. SELECT DISTINCT OperId, Abonent
  93. FROM Abonents1
  94. -----------------------------------
  95.  
  96. DELETE @FilteredEffort
  97.  
  98. DECLARE @OperContacts TABLE(OperId uniqueidentifier, AbonentCount int)
  99.  
  100. INSERT INTO @OperContacts
  101. SELECT OperId, COUNT(Abonent)
  102. FROM @Abonents2
  103. GROUP BY OperId
  104.  
  105. DELETE @Abonents2
  106. ----------------------------------------------------------------------------------------
  107.  
  108. -----СЧИТАЕМ ВРЕМЯ В СИСТЕМЕ------------------------------------------------------------
  109. DECLARE @SystemTime TABLE(OperId uniqueidentifier, LenTime int)
  110.  
  111. INSERT INTO @SystemTime
  112. SELECT UserId
  113.     , SUM(LenTime)
  114. FROM @FilteredTable
  115. GROUP BY UserId;
  116. -----------------------------------------------------------------------------------------
  117.  
  118. -----ВЫВОД РЕЗУЛЬТАТА--------------------------------------------------------------------
  119. SELECT OI.Name as 'Имя'
  120.     , (SELECT [dbo].[GetTimeFromSecond](ISNULL(ST.LenTime, 0))) as 'Время в системе'
  121.     , (SELECT [dbo].[GetTimeFromSecond](ISNULL(SI.LenTime, 0))) as 'Время разговора'
  122.     , (SELECT [dbo].[GetTimeFromSecond](ISNULL(SI.AvgTime, 0))) as 'Среднее время разговора'
  123.     , ISNULL(AI.[Count], 0) as 'Количество звонков'
  124.     , ISNULL(OC.AbonentCount, 0) as 'Количество контактов'
  125.     , ISNULL(ROUND(AI.[Count] / CAST(IIF(OC.AbonentCount != 0, OC.AbonentCount, 1) as float), 2), 0) as 'Количество звонков к контакту'
  126.     , ISNULL(SI.[Count], 0) as 'Дозвон'
  127.     , ISNULL(CAST(ROUND(SI.[Count] / CAST(IIF(AI.[Count] != 0, AI.[Count], 1) as float), 4) * 100 as nvarchar(10)) + '%', '0%') as 'Процент дозвона'
  128. FROM @SystemTime AS ST
  129. LEFT JOIN [oktell_cc_temp].[dbo].[A_Cube_CC_Cat_OperatorInfo] AS OI
  130.     ON ST.OperId = OI.Id
  131. LEFT JOIN @SuccessIncom as SI
  132.     ON ST.OperId = SI.OperId
  133. LEFT JOIN @AllIncom as AI
  134.     ON ST.OperId = AI.OperId
  135. LEFT JOIN @OperContacts as OC
  136.     ON ST.OperId = OC.OperId
  137. -------------------------------------------------------------------------------------------------------
  138.  
  139.  
  140. Информацию извлекал из таблиц - EffortConnections, OperatorStates, OperatorInfo
  141.  
  142. Удачные звонки от неудачных я отделял по таблице EffortConnections по полю CallResult
  143.  
  144. Примерный Расчет сложности выполнения запроса:
  145.  
  146. Размер таблицы OperatorStates  = OS; EffortConnections = EC; OperatorInfo = OI
  147. Размеры фильтров - Дата = d; Таски = t; Операторы = op
  148.  
  149. Fa - сложность функции подсчета среднего
  150. Fs - сложность функции подсчета суммы
  151. Fsec - сложность функции получения секунд от времени
  152. Fcast, F/
  153. Join - сложность джойна одной ячейки
  154.  
  155. Знак равно задает приблизительное соответсвие
  156.  
  157. 1.) FilteredTable
  158.     Сложность построения = O(OS * t * op)
  159.     Длина = O(d)
  160.  
  161. 2.) FilteredEffort
  162.     Сложность построения = O(EC * t * op)
  163.     Длина = O(d)
  164.  
  165. 3.) SuccessIncom
  166.     Сложность построения = FE * (op + Fs * op + Fa * op) = 3 * O(d) * O(op) = O(d * op)
  167.     Длина = O(d / (2 * op)
  168.  
  169. 4.) FailedIncom
  170.     Сложность построения = FE * (op + Fs * op) = O(d * op)
  171.     Длина = O(d / (2 * op))
  172.  
  173. 5.) AllIncom
  174.     Сложность построения = FE * (op + Fs * op) = O(d * op)
  175.     Длина = O(d / op)
  176.  
  177. 6.) Abonents1
  178.     Сложность построения = O(d)
  179.     Длина = O(d)
  180.  
  181. 7.) Abonents2
  182.     Сложность построения = O(d)
  183.     Длина = O(d)
  184.  
  185. 8.) OperContacts
  186.     Сложность построения = O(d * op)
  187.     Длина = O(d / op)
  188.  
  189. 9.) SystemTime
  190.     Сложность построения = O(d * op)
  191.     Длина = O(d / op)
  192.  
  193. 10.) FinalQuery
  194.     Сложность построения = O[((7d + OI) / op) * Join * (3Fsec + 2F/ + 2Fcast)] примерно равно = O[(7d + OI) / op] * J
  195.  
  196. Ответ = O
  197.     [
  198.       op * [d + t(EC + OS)] + [((d + OI) * J) / op]
  199.     ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement