Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 10.54 KB | None | 0 0
  1. DROP TABLE user_dates
  2. CREATE TABLE user_dates AS (
  3.     WITH filtered_accounts AS (
  4.         SELECT COALESCE(master_account_id, id) AS id_acc, *
  5.         FROM accounts
  6.         WHERE NOT (name ~* '(test)|(qa)' OR client_type IN (4, 5))
  7.     ),
  8.          cookie_last_click AS (
  9.              SELECT
  10.                     last_value(utmcampaign) OVER (partition BY clientid ORDER BY visits.DATE)  cookie_utmcampaign_lc,
  11.                     last_value(utmsource) OVER (partition BY clientid ORDER BY visits.DATE)  cookie_utmsource_lc,
  12.                     last_value(utmmedium) OVER (partition BY clientid ORDER BY visits.DATE)  cookie_utmmedium_lc,
  13.                     last_value(utmcontent) OVER (partition BY clientid ORDER BY visits.DATE)  cookie_utmcontent_lc,
  14.                     visits.watchids,
  15.                     visits.clientid  AS  clientid_
  16.              FROM etl.stg_ym_visits_unnest visits
  17.              WHERE (utmcampaign IS NOT NULL) AND (utmsource IS NOT NULL) AND (utmmedium IS NOT NULL)
  18.          ),
  19.  
  20.          visits_with_accounts AS (
  21.              SELECT first_value(lasttrafficsource) OVER (partition BY visits.clientid ORDER BY DATE) original_source,
  22.                     first_value(utmcontent) OVER (partition BY visits.clientid ORDER BY DATE)        original_utmcontent,
  23.                     first_value(utmsource) OVER (partition BY visits.clientid ORDER BY DATE)         original_utmsource,
  24.                     first_value(utmcampaign) OVER (partition BY visits.clientid ORDER BY DATE)       original_utmcampaign,
  25.                     first_value(utmmedium) OVER (partition BY visits.clientid ORDER BY DATE)         original_utmmedium,
  26.                     COALESCE(utmcontent, utmcampaign)  AS utm_union_,
  27.                     first_value(created_at) OVER (partition BY a.id_acc ORDER BY created_at)    AS account_creation_date,
  28.                     *
  29.  
  30.              FROM etl.stg_ym_visits_unnest visits
  31.              LEFT JOIN cookie_last_click cc ON (visits.watchids = cc.watchids) AND (visits.clientid = cc.clientid_)
  32.                       FULL OUTER JOIN filtered_accounts a ON visits.account_id = a.id
  33.          ),
  34.  
  35.          user_agg AS (
  36.              SELECT MIN(DATE)                     AS user_creation_date,
  37.                    /* first_value(cast(min(created_at) as date)) over (partition by id_acc order by min(created_at))
  38.                         as account_creation_date,*/ /*!после агрегации получаются несколько значений*/
  39.                     MIN(original_source)          AS original_source,
  40.                     CASE
  41.                     WHEN MIN(original_utmcampaign)='courses'
  42.                         THEN MIN(original_utmcontent)
  43.                         ELSE MIN(original_utmcampaign)
  44.                         END AS utmcampaign_union,
  45.                     MIN(original_utmcontent)      AS utmcontent,
  46.                     MIN(original_utmsource)       AS utmsource,
  47.                     MIN(original_utmmedium)       AS utmmedium,
  48.                     MIN(master_account_id)        AS master_account_id,
  49.                     MIN(utm_union_)               AS utm_union,
  50.                     CASE
  51.                     WHEN MIN(cookie_utmcampaign_lc)='courses'
  52.                         THEN MIN(cookie_utmcontent_lc)
  53.                         ELSE MIN(cookie_utmcampaign_lc)
  54.                         END AS cookie_campaign_lc,
  55.                     MIN(cookie_utmsource_lc)    AS cookie_source_lc,
  56.                     MIN(cookie_utmmedium_lc)    AS cookie_medium_lc,
  57.                     id_acc,
  58.                     account_creation_date,
  59.                     clientid
  60.              FROM visits_with_accounts
  61.              GROUP BY id_acc, clientid, account_creation_date
  62.          ),
  63.  
  64.          acc_last_click AS (
  65.              SELECT CASE
  66.                         WHEN last_value(va.utmcampaign) OVER (partition BY va.id_acc ORDER BY DATE) = 'courses'
  67.                         THEN last_value(va.utmcontent) OVER (partition BY va.id_acc ORDER BY DATE)
  68.                         ELSE last_value(va.utmcampaign) OVER (partition BY va.id_acc ORDER BY DATE)
  69.                         END AS acc_campaign_lc,
  70.                     last_value(va.utmmedium) OVER (partition BY va.id_acc ORDER BY DATE) AS acc_utmmedium_lc,
  71.                     last_value(va.utmsource) OVER (partition BY va.id_acc ORDER BY DATE) AS acc_utmsource_lc,
  72.                     last_value(va.utmcontent) OVER (partition BY va.id_acc ORDER BY DATE ) AS acc_utmcontent_lc,
  73.                     va.id_acc AS id_ac
  74.              FROM visits_with_accounts va
  75.              WHERE  (va.date<=va.account_creation_date) AND (va.utmcampaign IS NOT NULL) AND (va.utmsource IS NOT NULL)
  76.              AND (va.utmmedium IS NOT NULL)
  77.          ),
  78.  
  79.          with_fucd AS (
  80.              SELECT MIN(user_creation_date) OVER (partition BY ug.id_acc)      AS first_user_creation_date,
  81.                     first_value(original_source) OVER (partition BY ug.id_acc ORDER BY user_creation_date) AS account_original_source,
  82.                     first_value(utmcampaign_union) OVER (partition BY ug.id_acc ORDER BY user_creation_date) AS account_utmcampaign_source,
  83.                     /*first_value(ads.cpc_avg) over (partition by ug.id_acc order by user_creation_date) as account_cpc_avg,*/
  84.                     first_value(utmsource) OVER (partition BY ug.id_acc ORDER BY user_creation_date) AS account_utmsource_source,
  85.                     first_value(utmmedium) OVER (partition BY ug.id_acc ORDER BY user_creation_date) AS account_utmmedium_source,
  86.                     COUNT(clientid) OVER (partition BY ug.id_acc) AS clientid_count,
  87.                     *
  88.              FROM user_agg ug
  89.              LEFT JOIN acc_last_click acl ON acl.id_ac = ug.id_acc
  90.  
  91.          ),
  92.  
  93.  
  94.          acc_id_orders AS (
  95.              SELECT id_acc, o.*
  96.              FROM filtered_accounts
  97.                       JOIN orders o ON (o.account_id = filtered_accounts.id)
  98.              WHERE o.STATUS = 3
  99.          ),
  100.          id_acc_stats AS (
  101.              SELECT id_acc,
  102.                     COUNT(DISTINCT id) order_id_count,
  103.                     MIN(id)            first_order_id,
  104.                     SUM(amount)        order_amount_sum
  105.              FROM acc_id_orders
  106.              GROUP BY id_acc
  107.          ),
  108.          id_acc_counts AS (
  109.              SELECT id_acc,
  110.                     account_id_count
  111.              FROM (
  112.                       SELECT master_account_id,
  113.                              COUNT(DISTINCT id) AS account_id_count
  114.                       FROM filtered_accounts
  115.                       GROUP BY master_account_id
  116.                   ) stats
  117.                       JOIN filtered_accounts
  118.                            ON filtered_accounts.master_account_id = stats.master_account_id
  119.              UNION ALL
  120.              SELECT master_account_id,
  121.                     COUNT(DISTINCT id) AS account_id_count
  122.              FROM filtered_accounts
  123.              GROUP BY master_account_id
  124.              UNION ALL
  125.              SELECT id, 0
  126.              FROM filtered_accounts
  127.              WHERE id NOT IN (
  128.                  SELECT master_account_id
  129.                  FROM accounts
  130.                  WHERE filtered_accounts.master_account_id IS NOT NULL
  131.              )
  132.          ),
  133.          user_dates AS (
  134.              SELECT CASE
  135.                         WHEN MIN(user_creation_date) OVER (partition BY clientid) >
  136.                              MIN(account_creation_date) OVER (partition BY clientid)
  137.                             AND MIN(account_creation_date) OVER (partition BY clientid) >
  138.                                 MIN(first_user_creation_date) OVER (partition BY clientid)
  139.                             THEN MIN(first_user_creation_date) OVER (partition BY clientid)
  140.                         WHEN MIN(user_creation_date) OVER (partition BY clientid) >
  141.                              MIN(account_creation_date) OVER (partition BY clientid)
  142.                             AND
  143.                              MIN(first_user_creation_date) OVER (partition BY clientid) >
  144.                              MIN(account_creation_date) OVER (partition BY clientid)
  145.                             THEN MIN(account_creation_date) OVER (partition BY clientid)
  146.                         ELSE MIN(user_creation_date) OVER (partition BY clientid)
  147.                         END AS calculated_user_creation_date,
  148.                     *
  149.              FROM with_fucd
  150.          )
  151.     SELECT CASE
  152.                WHEN u.id_acc IS NOT NULL THEN account_creation_date
  153.                ELSE user_creation_date
  154.                END AS unit_date,
  155.            CASE
  156.                WHEN u.id_acc IS NULL AND o.id IS NULL THEN 1
  157.                WHEN u.id_acc IS NOT NULL AND o.id IS NULL THEN 2
  158.                WHEN u.id_acc IS NOT NULL AND o.id IS NOT NULL THEN 3
  159.                END AS stage,
  160.            CASE
  161.                WHEN s.order_id_count > 1 THEN 2
  162.                WHEN s.order_id_count = 1 THEN 1
  163.                WHEN s.order_id_count = 0 THEN 0
  164.                END AS retention,
  165.            CASE
  166.                WHEN u.clientid_count > 0 THEN s.order_amount_sum/u.clientid_count/s.order_id_count
  167.                ELSE 0
  168.                END AS test_sum,
  169.             CASE
  170.                WHEN u.clientid_count > 0 AND s.order_id_count>0 THEN 1.0/u.clientid_count
  171.                ELSE 0
  172.                END AS test_order_id_sum,
  173.            u.*,
  174.            s.order_id_count,
  175.            s.first_order_id,
  176.            s.order_amount_sum,
  177.            c.account_id_count,
  178.            o.account_id,
  179.            o.act_content_type,
  180.            o.act_file_name,
  181.            o.act_file_size,
  182.            o.act_number,
  183.            o.act_updated_at,
  184.            o.additional_memory,
  185.            o.amount,
  186.            o.created_at,
  187.            o.description,
  188.            o.disposable,
  189.            o.doc_content_type,
  190.            o.doc_file_name,
  191.            o.doc_file_size,
  192.            o.doc_updated_at,
  193.            o.expiration_time,
  194.            o.id,
  195.            o.invoice_content_type,
  196.            o.invoice_file_name,
  197.            o.invoice_file_size,
  198.            o.invoice_updated_at,
  199.            o.mandatory,
  200.            o.mode,
  201.            o.month_count,
  202.            o.name,
  203.            o.params,
  204.            o.payment_till,
  205.            o.payment_time,
  206.            o.payment_uid,
  207.            o.starting_time,
  208.            o.STATUS,
  209.            o.subscription_id,
  210.            o.updated_at,
  211.            o.user_id
  212.     FROM user_dates u
  213.              LEFT JOIN acc_id_orders o ON (u.id_acc = o.id_acc)
  214.              LEFT JOIN id_acc_stats s ON (u.id_acc = s.id_acc)
  215.              LEFT JOIN id_acc_counts c ON (u.id_acc = c.id_acc)
  216. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement