K87L8BZBS6

Первый звонок по phone_numbers

Dec 23rd, 2024 (edited)
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- https://tracker.yandex.ru/ANALYTICS-3275
  2.  
  3. -- Описание логики на вики п.2 : https://wiki.yandex.ru/analytics/unificirovannye-metriki/raspredelenie-sdelok-po-menedzheram-1-linii/
  4. --explain
  5.  
  6. WITH pupils_filtered AS (
  7. -- выбор учеников
  8.     SELECT
  9.         pupils.pupil_id,
  10.         pupils.create_time as create_time,
  11.         amocrm_leads.created_at date_created_lead,
  12.         pupils.amo_lead_id,
  13.         responsible_amocrm_user_id,
  14.         mart.pupils.ref_by
  15.  
  16. FROM mart.pupils
  17.     JOIN mart.amocrm_leads
  18.         ON pupils.amo_lead_id= amocrm_leads.amo_lead_id
  19.  
  20.    AND (NOT amocrm_leads.is_deleted)
  21.         AND (NOT tutor_pipeline_presence)
  22.         --сделки не должны относиться к преподавателям, так же они могут выйти из воронки преподавателей в другую воронку, нам нужно исключить такие сделки из поиска (ANALYTICS-1478)
  23.  
  24. WHERE TRUE
  25.         and pupils.create_time::date >= '2024-01-17'::date
  26.         AND "mart"."pupils"."create_date" BETWEEN timestamp with time zone '2024-12-01 00:00:00.000Z' AND timestamp with time zone '2024-12-18 00:00:00.000Z'
  27.  
  28.         --https://tracker.yandex.ru/ANALYTICS-3327
  29.  
  30.  
  31.         --пример сделок с мини ВУ
  32.         --AND mart.pupils.amo_lead_id IN (34083314,35959229,35960371,35962601,35962841,35962957,35963839)
  33. ),
  34. needed_events AS (
  35.     SELECT
  36.         events_with_lessons.event_id,
  37.         events_with_lessons.created_at,
  38.         sales_managers_ids.email AS manager_email,
  39.         sales_managers_ids.employee_name AS manager_name,
  40.         sales_managers_ids.teamlead,
  41.         sales_managers_ids.sales_department,
  42.         events_with_lessons.planned_by_pupil,
  43.         pupils_filtered.pupil_id,
  44.         pupils_filtered.create_time,
  45.         number_of_booking,
  46.         primacy_of_finished_intro,
  47.         start_time,
  48.         --https://tracker.yandex.ru/ANALYTICS-3481
  49.         --разметим мини ВУ
  50.         mart.events_with_lessons.is_mini_group_intro_lesson,
  51.         pupils_filtered.ref_by
  52.     FROM pupils_filtered
  53.     JOIN mart.events_with_lessons
  54.         ON events_with_lessons.pupil_id = pupils_filtered.pupil_id
  55.  
  56. LEFT JOIN mart.sales_managers_ids
  57.         ON mart.events_with_lessons.auction_or_event_created_by = sales_managers_ids.tetrika_user_id
  58.         AND events_with_lessons.created_at >= sales_managers_ids.hire_date
  59.         AND events_with_lessons.created_at <= sales_managers_ids.dismissal_date
  60.     WHERE 1=1
  61.         AND (events_with_lessons.number_of_booking = 1
  62.     OR primacy_of_finished_intro = 1)
  63.         AND mart.events_with_lessons.created_at::date >= '2024-01-01'
  64.         and mart.events_with_lessons.is_intro_lesson = 1
  65.         and mart.events_with_lessons.lesson_not_cancelled_in_1_hour
  66. ),
  67. vy_lessons AS (
  68.     SELECT
  69.         needed_events.event_id,
  70.         needed_events.created_at,
  71.         needed_events.manager_email,
  72.         needed_events.manager_name,
  73.         needed_events.teamlead,
  74.         needed_events.sales_department,
  75.         needed_events.planned_by_pupil,
  76.         needed_events.pupil_id,
  77.         needed_events.create_time,
  78.         --https://tracker.yandex.ru/ANALYTICS-3481
  79.         is_mini_group_intro_lesson,
  80.         needed_events.ref_by
  81.     FROM needed_events
  82.     WHERE needed_events.number_of_booking = 1
  83. ),
  84. -- https://tracker.yandex.ru/ANALYTICS-3275
  85. naumen_calls AS (
  86. -- определяем почту первого менеджера, на которого распределился звонок в Naumen
  87. -- учитываются только те звонки, что произошли в рамках согласованных заказчиком проектов.
  88.     SELECT
  89.         mart.naumen_calls.phone_numbers,
  90.         amo_lead_id,
  91.         pupil_id,
  92.         email,
  93.         attempt_start,
  94.         ROW_NUMBER() OVER (PARTITION BY phone_numbers
  95. ORDER BY attempt_start) AS rn
  96.     FROM mart.naumen_calls
  97.     WHERE 1=1
  98.         AND project_uuid IN (   'corebo00000000000onj788922ojjjvc', -- Проект 1линия Записи УЧИ.Дома
  99.                                 'corebo00000000000oquar33hkk692ko', -- Реактивация 1линия Записи УЧИ.Дома
  100.                                 'corebo00000000000oqca15dbh5npodg', -- Обзвон Автоответчиков
  101.                                 'corebo00000000000offehadeg337ve0', -- Проект Основная воронка
  102.                                 'corebo00000000000oq6rtbo1n8omgm0', -- Реактивация Основная воронка
  103.                                 'corebo00000000000outp9p3qlva0hcs', -- Проект 1линия_Теплый_трафик_new,
  104.                                 'corebo00000000000otqmsmb32734gmo' -- реактивация Неактивного ученика --https://tracker.yandex.ru/ANALYTICS-3683
  105.                             )
  106.         AND email IS NOT NULL
  107.  
  108.         and mart.naumen_calls.attempt_start::date >= '2024-01-01'
  109.     ORDER BY attempt_start
  110. ),
  111. -- https://tracker.yandex.ru/ANALYTICS-3275
  112. naumen_calls_with_teamlead_info AS (
  113. -- к первому менеджеру, на которого распределился звонок в Naumen, добавляем информацию о его тимлиде
  114.     SELECT
  115.         naumen_calls.amo_lead_id,
  116.         -- https://tracker.yandex.ru/ANALYTICS-3275
  117.         naumen_calls.pupil_id,
  118.         sales_managers_ids.email AS manager_email,
  119.         sales_managers_ids.employee_name AS manager_name,
  120.         sales_managers_ids.teamlead,
  121.         sales_managers_ids.sales_department,
  122.         naumen_calls.attempt_start
  123.     FROM naumen_calls
  124.     LEFT JOIN mart.sales_managers_ids
  125.         ON sales_managers_ids.email = naumen_calls.email
  126.         AND naumen_calls.attempt_start BETWEEN sales_managers_ids.hire_date AND sales_managers_ids.dismissal_date
  127.     WHERE naumen_calls.rn = 1
  128.     -- реализация с 1/0 была бы скорей всего сложнее, потому я просто выключаю кусок кода "кнопкой" empty_events_logic_filter
  129.     -- этот кусок кода нужендля того чтобы если не нашлось звонков в Naumen, то брали бы текущего ОМ по сделке при этом не нарушая всю предыдущую логику
  130.  
  131. ),
  132. first_sales_responsibles AS (
  133. -- первые оплаты и ответственные менеджеры по сделкам во время оплаты
  134.     SELECT
  135.         pupils_filtered.pupil_id,
  136.         pupils_filtered.amo_lead_id,
  137.         sales_managers_ids.employee_name ,
  138.         sales_managers_ids.teamlead ,
  139.         sales_managers_ids.email AS manager_email,
  140.         sales_managers_ids.sales_department,
  141.         pupils_with_payments_info.first_payment_at
  142.     FROM pupils_filtered
  143.     JOIN mart.pupils_with_payments_info
  144.         ON pupils_with_payments_info.pupil_id =pupils_filtered.pupil_id
  145.     LEFT JOIN mart.leads_responsible_users_changes_v4
  146.         ON pupils_filtered.amo_lead_id =leads_responsible_users_changes_v4.amo_lead_id
  147.         AND pupils_with_payments_info.first_payment_at BETWEEN leads_responsible_users_changes_v4.responsible_from AND leads_responsible_users_changes_v4.responsible_to
  148.     LEFT JOIN mart.sales_managers_ids
  149.         ON leads_responsible_users_changes_v4.responsible_user_id =sales_managers_ids.amocrm_user_id
  150.         AND pupils_with_payments_info.first_payment_at BETWEEN sales_managers_ids.hire_date AND sales_managers_ids.dismissal_date
  151.     WHERE TRUE
  152.     and first_payment_at::date >= '2024-01-01'
  153. ),
  154. leads_events_info AS (
  155.     -- информация по лиду и действиям первой линии по этому лиду
  156.     -- https://tracker.yandex.ru/ANALYTICS-3275
  157.     -- заменил CTE 'union_events' из предыдущей версии отчета на CTE 'naumen_calls_with_teamlead_info'
  158.     SELECT
  159.         COALESCE(naumen_by_pupil.amo_lead_id, naumen_by_lead.amo_lead_id) AS amo_lead_id,
  160.         date_created_lead,
  161.         --добавим инфу по мини
  162.         --https://tracker.yandex.ru/ANALYTICS-3481
  163.         vy_lessons.is_mini_group_intro_lesson,
  164.         first_sales_responsibles.first_payment_at AS first_sales_responsibles_first_payment_at,
  165.         vy_lessons.created_at AS vy_lessons_created_at,
  166.         naumen_by_lead.attempt_start AS naumen_by_lead_attempt_start,
  167.         naumen_by_pupil.attempt_start AS naumen_by_pupil_attempt_start,
  168.         COALESCE(first_sales_responsibles.teamlead, vy_lessons.teamlead, naumen_by_lead.teamlead, naumen_by_pupil.teamlead) AS teamlead,
  169.         COALESCE(first_sales_responsibles.employee_name, vy_lessons.manager_name, naumen_by_lead.manager_name, naumen_by_pupil.manager_name) AS manager_name,
  170.         COALESCE(first_sales_responsibles.manager_email, vy_lessons.manager_email, naumen_by_lead.manager_email, naumen_by_pupil.manager_email) AS email,
  171.         COALESCE(naumen_by_lead.attempt_start, naumen_by_pupil.attempt_start) AS created_at,
  172.         pupils_filtered.pupil_id,
  173.         pupils_filtered.ref_by,
  174.         (first_sales_responsibles.pupil_id is not null)::int payment_flag,  -- флаг о том что оплата была произведена раньше ВУ
  175.     -- ставим отметку какой по счету менеджер работал с этим ли) чтобы новые лиды учесть только первому менеджеру
  176.     -- https://tracker.yandex.ru/ANALYTICS-3275:
  177.     -- здесь заменил ORDER BY union_events.created_at на COALESCE, так как порой значение в naumen_calls_with_teamlead_info.attempt_start пустое
  178.         ROW_NUMBER() OVER (PARTITION BY pupils_filtered.pupil_id ORDER BY
  179.                             first_sales_responsibles.first_payment_at,
  180.                             vy_lessons.created_at,
  181.                             naumen_by_lead.attempt_start,
  182.                             naumen_by_pupil.attempt_start) AS num_manager
  183.     FROM pupils_filtered
  184.     -- https://tracker.yandex.ru/ANALYTICS-3275
  185.     LEFT JOIN naumen_calls_with_teamlead_info AS naumen_by_lead
  186.         ON pupils_filtered.amo_lead_id = naumen_by_lead.amo_lead_id
  187.     LEFT JOIN naumen_calls_with_teamlead_info AS naumen_by_pupil
  188.         ON pupils_filtered.pupil_id = naumen_by_pupil.pupil_id
  189.     LEFT JOIN vy_lessons
  190.         ON pupils_filtered.pupil_id = vy_lessons.pupil_id
  191.     LEFT JOIN first_sales_responsibles
  192.         ON pupils_filtered.pupil_id = first_sales_responsibles.pupil_id
  193.         AND
  194.             (
  195.             first_sales_responsibles.first_payment_at < vy_lessons.created_at
  196.             OR
  197.             vy_lessons.created_at IS NULL
  198.             )
  199.     WHERE TRUE
  200.     -- оставляем события по лиду только те, которые происходили после дня создания лида. есть события с датой более ранней, чем дата создания
  201.     -- https://tracker.yandex.ru/ANALYTICS-3275:
  202.     -- здесь заменил union_events.created_at::date на COALESCE, так как порой значение в naumen_calls_with_teamlead_info.attempt_start пустое
  203.     AND COALESCE(first_sales_responsibles.first_payment_at, vy_lessons.created_at, naumen_by_lead.attempt_start, naumen_by_pupil.attempt_start)::date >= date_created_lead::date
  204.     -- выбираем менеджеров, которые имеют отношение к 1-й линии
  205.     AND COALESCE(first_sales_responsibles.sales_department, vy_lessons.sales_department, naumen_by_lead.sales_department, naumen_by_pupil.sales_department) = '1 линия'
  206.     -- отсеиваем самозаписи, лиды у которых не было записей вообще, тоже должны оставаться
  207.     AND (NOT planned_by_pupil OR planned_by_pupil IS NULL)
  208. ),
  209. count_leads AS (
  210. -- группируем по менеджеру и дате, считаем сколько он вел новых лидов
  211.     SELECT
  212.         teamlead,
  213.         manager_name,
  214.         email,
  215.         COUNT(pupil_id) AS lead_new,
  216.         count(pupil_id) filter (where ref_by is not null) lead_new_ref,
  217.         sum(payment_flag) AS payment_new
  218.     FROM leads_events_info
  219.     WHERE num_manager = 1
  220.  
  221. GROUP BY 3,2,1
  222. )
  223. --select * from count_leads
  224. ,
  225. first_vy_lessons AS (
  226. -- первые записи по менеджерам
  227.     SELECT
  228.         COALESCE(vy_lessons.teamlead, 'not 1st line') as teamlead,
  229.         COALESCE(vy_lessons.manager_name,'not 1st line') AS manager_name,
  230.         COALESCE(vy_lessons.manager_email,'not 1st line') as email,
  231.         --https://tracker.yandex.ru/ANALYTICS-3481
  232.         COUNT(pupil_id) FILTER (WHERE is_mini_group_intro_lesson IS false) AS intros_new_ind,
  233.         COUNT(pupil_id) FILTER (WHERE is_mini_group_intro_lesson) AS intros_new_mini,
  234.         COUNT(pupil_id) FILTER (WHERE ref_by is not null) AS intros_ref
  235.     FROM vy_lessons
  236.     WHERE TRUE
  237.  
  238.     AND (created_at)::date <= timestamp with time zone '2024-12-19 00:00:00.000Z'
  239.     GROUP BY 1,2,3
  240. ),
  241. first_yvy_lessons AS (
  242. -- первые УВУ по менеджерам
  243.     SELECT
  244.         needed_events.manager_name,
  245.         needed_events.teamlead ,
  246.         needed_events.manager_email,
  247.         ----https://tracker.yandex.ru/ANALYTICS-3481
  248.         COUNT(needed_events.pupil_id) FILTER (WHERE is_mini_group_intro_lesson IS false) fin_intros_new_ind,
  249.         COUNT(needed_events.pupil_id) FILTER (WHERE is_mini_group_intro_lesson) AS fin_intros_new_mini
  250.     FROM needed_events
  251.     WHERE sales_department = '1 линия'
  252.     AND primacy_of_finished_intro = 1
  253.  
  254.     AND start_time::date <= timestamp with time zone '2024-12-19 00:00:00.000Z'
  255.     GROUP BY 1,2,3
  256. ),
  257. first_sales AS (
  258. -- все первые оплаты по менеджерам (не только те, которые проходили до первой записи на ВУ)
  259.     SELECT
  260.         first_sales_responsibles.teamlead,
  261.         first_sales_responsibles.employee_name AS manager_name,
  262.         first_sales_responsibles.manager_email,
  263.         COUNT(first_sales_responsibles.pupil_id) AS first_sale_new
  264.     FROM first_sales_responsibles
  265.     INNER JOIN pupils_filtered
  266.         ON pupils_filtered.pupil_id = first_sales_responsibles.pupil_id
  267.     WHERE 1=1
  268.     AND first_sales_responsibles.sales_department = '1 линия'
  269.  
  270.     AND first_payment_at::date <= timestamp with time zone '2024-12-19 00:00:00.000Z'
  271.     GROUP BY 1,2,3
  272. ),
  273. final_table AS (
  274.     SELECT
  275.         COALESCE(count_leads.teamlead, intros.teamlead, first_yvy_lessons.teamlead, first_sales.teamlead) as teamlead,                                    --так как по лидам у некоторых по нулям, пришлось выбирать из тимлидов и менеджеров по лидам/первым оплатам
  276.         COALESCE(count_leads.manager_name, intros.manager_name, first_yvy_lessons.manager_name, first_sales.manager_name) as manager_name,
  277.         COALESCE(count_leads.email, intros.email, first_yvy_lessons.manager_email, first_sales.manager_email) as manager_mail,
  278.         COALESCE(lead_new, 0) as lead_new,
  279.         COALESCE(count_leads.payment_new, 0) AS payment_before_vu_new,
  280.         COALESCE(first_sales.first_sale_new, 0) AS first_sale_new,
  281.         COALESCE(intros_new_ind, 0) as intros_new_ind,
  282.         COALESCE(intros_new_mini, 0) as intros_new_mini,
  283.         CASE
  284.             WHEN lead_new > 0 THEN ROUND(intros_new_ind::NUMERIC / lead_new, 2)
  285.             ELSE 0
  286.         END AS convertion_intros_new_ind,
  287.         COALESCE(fin_intros_new_ind, 0) as fin_intros_new_ind,
  288.         COALESCE(fin_intros_new_mini, 0) as fin_intros_new_mini,
  289.         CASE
  290.             WHEN intros_new_ind > 0 THEN ROUND(fin_intros_new_ind::NUMERIC / intros_new_ind, 2)
  291.             ELSE 0
  292.         END AS convertion_fin_intros_new_ind,
  293.         CASE
  294.             WHEN lead_new > 0 THEN ROUND(fin_intros_new_ind::NUMERIC / lead_new, 2)
  295.             ELSE 0
  296.         END AS convertion_trough_new_ind,
  297.         COALESCE(lead_new_ref, 0) as lead_new_ref,
  298.         COALESCE(intros_ref,0) as intros_ref
  299.     FROM count_leads
  300.     LEFT JOIN first_vy_lessons AS intros
  301.         ON intros.email = count_leads.email
  302.         AND intros.teamlead = count_leads.teamlead
  303.     LEFT JOIN first_yvy_lessons
  304.         ON first_yvy_lessons.manager_email = COALESCE(intros.email, count_leads.email)
  305.         and first_yvy_lessons.teamlead = COALESCE(intros.teamlead, count_leads.teamlead)
  306.     FULL JOIN first_sales   -- здесь фулл джойн на все первые оплаты, а не только на те оплаты которые произошли до ВУ
  307.         ON first_sales.manager_email = COALESCE(first_yvy_lessons.manager_email, intros.email, count_leads.email)
  308.         and first_sales.teamlead = COALESCE(first_yvy_lessons.teamlead, intros.teamlead, count_leads.teamlead)
  309. )
  310. SELECT *
  311. FROM naumen_calls
  312. WHERE TRUE = TRUE
  313.     AND phone_numbers = '+79260635655'
Advertisement
Add Comment
Please, Sign In to add comment