Advertisement
volday

Доля дох по к-ву дн м/перв онл сесс и ROPO покупк с конв-окн

Sep 17th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.32 KB | None | 0 0
  1. #standardSQL
  2. --Доля дохода по количеству дней между первой онлайн сессией и ROPO покупкой с конверсионным окном 30 дней за последние 7 дней
  3. SELECT
  4.     days_diff,
  5.         transaction_revenueShare --доля дохода
  6.  
  7. FROM
  8. (
  9.     SELECT
  10.         days_diff,
  11.         transactions_count AS transaction_numberOfTransactions,
  12.         transactions_count_summary AS transaction_numberOfTransactions_summary,
  13.         transactions_count / transactions_count_summary AS transaction_transactionsShare,
  14.         transaction_revenue AS transaction_totalRevenue,
  15.         transaction_revenue_summary AS transaction_totalRevenue_summary,
  16.         transaction_revenue / transaction_revenue_summary AS transaction_revenueShare,
  17.         users_count AS transaction_customersCount,
  18.         users_count_summary AS transaction_customersCount_summary,
  19.         users_count / users_count_summary AS transaction_customerShare,
  20.         aov AS transaction_aov,
  21.         aov_summary AS transaction_aov_summary
  22.     FROM
  23.     (
  24.         SELECT
  25.             days_diff,
  26.             transactions_count,
  27.             transaction_revenue,
  28.             users_count,
  29.             aov,
  30.             SUM(transactions_count) OVER() AS transactions_count_summary,
  31.             SUM(transaction_revenue) OVER() AS transaction_revenue_summary,
  32.             SUM(users_count) OVER() AS users_count_summary,
  33.             AVG(aov) OVER() AS aov_summary
  34.         FROM
  35.         (
  36.             SELECT
  37.                 TIMESTAMP_DIFF(transaction_created, prevSessionTime, DAY) AS days_diff,
  38.                 COUNT(DISTINCT transaction_id) AS transactions_count,
  39.                 SUM(transaction_revenue) AS transaction_revenue,
  40.                 AVG(transaction_revenue) AS aov,
  41.                 COUNT(DISTINCT user_id) AS users_count
  42.             FROM
  43.             (
  44.                 SELECT
  45.                         FIRST_VALUE(sessionTime IGNORE NULLS) OVER(PARTITION BY user_id ORDER BY sessionTimeInSeconds RANGE BETWEEN 2592000 PRECEDING AND CURRENT ROW) AS prevSessionTime,
  46.                     transaction_id,
  47.                     transaction_created,
  48.                     transaction_revenue,
  49.                     l_transaction_id,
  50.                     user_id
  51.                 FROM
  52.                 (
  53.                     SELECT
  54.                         l.sessionId AS sessionId,
  55.                         UNIX_SECONDS(COALESCE(l.sessionTime, r.transaction_created)) AS sessionTimeInSeconds,
  56.                         l.sessionTime AS sessionTime,
  57.                         r.transaction_created AS transaction_created,
  58.                         l.transaction_id AS l_transaction_id,
  59.                         r.transaction_id AS transaction_id,
  60.                         r.transaction_revenue AS transaction_revenue,
  61.                         COALESCE(r.user_id, l.user_id, l.prev_user_id, l.next_user_id, l.client_id) AS user_id
  62.                     FROM
  63.                     (
  64.                         SELECT
  65.     *,
  66.     FIRST_VALUE(user_id IGNORE NULLS) OVER(
  67.         PARTITION BY client_id
  68.         ORDER BY sessionTime DESC
  69.         ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  70.     ) AS prev_user_id,
  71.     FIRST_VALUE(user_id IGNORE NULLS) OVER(
  72.         PARTITION BY client_id
  73.         ORDER BY sessionTime DESC
  74.         ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
  75.     ) AS next_user_id
  76.                         FROM (
  77.                             SELECT
  78.                                 hits.TRANSACTION.transactionId AS transaction_id,
  79.                                 MAX(IF(USER.id IS NULL OR REGEXP_CONTAINS(USER.id, '^$|not set|undefined|^0$|(not set)|false|none'), NULL, USER.id)) AS user_id,
  80.                                 MAX(clientId) AS client_id,
  81.                                 sessionId AS sessionId,
  82.                                 TIMESTAMP_SECONDS(MIN(hits.TIME)) AS sessionTime
  83.                             FROM
  84.                                 `owox-140513.OWOXBI_Streaming.session_streaming_*`, unnest(hits) AS hits
  85.                             WHERE
  86.                                 _TABLE_SUFFIX BETWEEN FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -7 DAY))), INTERVAL -30 DAY))) AND FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP_ADD(TIMESTAMP_ADD(TIMESTAMP_TRUNC(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -1 DAY)), DAY), INTERVAL 1 DAY), INTERVAL -1 SECOND))
  87.                             GROUP BY
  88.                               sessionId,
  89.                               transaction_id
  90.                         )
  91.                     ) AS l
  92.                     FULL OUTER JOIN
  93.                     (
  94.                         SELECT
  95.                             transaction_id,
  96.                             SUM(product_price * product_quantity) AS transaction_revenue,
  97.                             user_id AS user_id,
  98.                             MIN(TIME) AS transaction_created
  99.                         FROM
  100.                             `owox-140513.1c.view_snapshot_completed_orders_view`
  101.                         WHERE
  102.                             TIME BETWEEN TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -7 DAY))), INTERVAL -30 DAY)) AND TIMESTAMP_ADD(TIMESTAMP_ADD(TIMESTAMP_TRUNC(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -1 DAY)), DAY), INTERVAL 1 DAY), INTERVAL -1 SECOND)
  103.                         GROUP BY
  104.                           transaction_id,
  105.                           user_id
  106.                     ) AS r
  107.                     ON l.transaction_id = r.transaction_id
  108.                 )
  109.             )
  110.             WHERE l_transaction_id IS NULL
  111.                 AND transaction_id IS NOT NULL
  112.                 AND prevSessionTime IS NOT NULL
  113.                 AND transaction_created BETWEEN TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -7 DAY)) AND TIMESTAMP_ADD(TIMESTAMP_ADD(TIMESTAMP_TRUNC(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -1 DAY)), DAY), INTERVAL 1 DAY), INTERVAL -1 SECOND)
  114.             GROUP BY
  115.                 days_diff
  116.         )
  117.     )
  118. )
  119.  
  120.         ORDER BY days_diff ASC
  121.         LIMIT 2500
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement