Advertisement
volday

Изм-е ROPO-доли дохода по дням за посл- 30 дн- с конв-окном

Sep 17th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 6.28 KB | None | 0 0
  1. #standardSQL
  2. --Изменение ROPO доли дохода по дням за последние 30 дней с конверсионным окном 30 дней
  3. SELECT
  4.             metric_online_only, --доля дохода ONLINE
  5.             metric_offline_only, --доля дохода OFFLINE
  6.             metric_ropo, --доля дохода ROPO
  7.     DATE
  8.  
  9. FROM
  10. (
  11.     SELECT
  12.         DATE,
  13.  
  14.            
  15.         SAFE_DIVIDE(revenue_online_only, revenue_total) AS metric_online_only,
  16.         SAFE_DIVIDE(revenue_offline_only, revenue_total) AS metric_offline_only,
  17.         SAFE_DIVIDE(revenue_ropo, revenue_total) AS metric_ropo
  18.  
  19.  
  20.     FROM
  21.     (
  22.         SELECT
  23.             DATE,
  24.  
  25.                     revenue_online_only,
  26.     revenue_offline_only,
  27.     revenue_ropo
  28.     ,
  29.         revenue_online_only + revenue_offline_only + revenue_ropo AS revenue_total,
  30.     SUM(revenue_online_only) OVER() AS revenue_online_only_summary,
  31.     SUM(revenue_offline_only) OVER() AS revenue_offline_only_summary,
  32.     SUM(revenue_ropo) OVER() AS revenue_ropo_summary
  33.  
  34.         FROM
  35.         (
  36.             SELECT
  37.                 DATE(TIME) AS DATE,
  38.  
  39.                                 SUM(IF(l_transaction_id IS NOT NULL AND transaction_id IS NOT NULL, transaction_revenue, 0)) AS revenue_online_only,
  40.             SUM(IF(l_transaction_id IS NULL AND transaction_id IS NOT NULL AND prevSessionTime IS NULL, transaction_revenue, 0)) AS revenue_offline_only,
  41.             SUM(IF(l_transaction_id IS NULL AND transaction_id IS NOT NULL AND prevSessionTime IS NOT NULL, transaction_revenue, 0)) AS revenue_ropo
  42.  
  43.             FROM
  44.             (
  45.                 SELECT
  46.                     FIRST_VALUE(sessionTime IGNORE NULLS) OVER(PARTITION BY user_id ORDER BY sessionTimeInSeconds RANGE BETWEEN 2592000 PRECEDING AND CURRENT ROW) AS prevSessionTime,
  47.                     TIME,
  48.                     transaction_id,
  49.                     transaction_created,
  50.                     transaction_revenue,
  51.                     l_transaction_id,
  52.                     user_id
  53.                 FROM
  54.                 (
  55.                     SELECT
  56.                         l.sessionId AS sessionId,
  57.                         UNIX_SECONDS(COALESCE(l.sessionTime, r.transaction_created)) AS sessionTimeInSeconds,
  58.                         COALESCE(l.sessionTime, r.transaction_created) AS TIME,
  59.                         l.sessionTime AS sessionTime,
  60.                         r.transaction_created AS transaction_created,
  61.                         l.transaction_id AS l_transaction_id,
  62.                         r.transaction_id AS transaction_id,
  63.                         COALESCE(l.transaction_revenue , r.transaction_revenue) AS transaction_revenue,
  64.                         COALESCE(r.user_id, l.user_id, l.prev_user_id, l.next_user_id, l.client_id) AS user_id
  65.                     FROM
  66.                     (
  67.                         SELECT
  68.     *,
  69.     FIRST_VALUE(user_id IGNORE NULLS) OVER(
  70.         PARTITION BY client_id
  71.         ORDER BY sessionTime DESC
  72.         ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
  73.     ) AS prev_user_id,
  74.     FIRST_VALUE(user_id IGNORE NULLS) OVER(
  75.         PARTITION BY client_id
  76.         ORDER BY sessionTime DESC
  77.         ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
  78.     ) AS next_user_id
  79.                         FROM (
  80.                             SELECT
  81.                                 hits.TRANSACTION.transactionId AS transaction_id,
  82.                                 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,
  83.                                 MAX(clientId) AS client_id,
  84.                                 sessionId AS sessionId,
  85.                                 SUM(IF(hits.eCommerceAction.action_type='refund' AND hits.TRANSACTION.transactionRevenue > 0, -hits.TRANSACTION.transactionRevenue, hits.TRANSACTION.transactionRevenue)) AS transaction_revenue,
  86.                                 TIMESTAMP_SECONDS(MIN(hits.TIME)) AS sessionTime
  87.                             FROM
  88.                                 `owox-140513.OWOXBI_Streaming.session_streaming_*`, unnest(hits) AS hits
  89.                             WHERE
  90.                                 _TABLE_SUFFIX BETWEEN FORMAT_TIMESTAMP('%Y%m%d', TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -30 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))
  91.                             GROUP BY
  92.                               sessionId,
  93.                               transaction_id
  94.                         )
  95.                     ) AS l
  96.                     FULL OUTER JOIN
  97.                     (
  98.                         SELECT
  99.                             transaction_id,
  100.                             SUM(product_price * product_quantity) AS transaction_revenue,
  101.                             user_id AS user_id,
  102.                             MIN(TIME) AS transaction_created
  103.                         FROM
  104.                             `owox-140513.1c.view_snapshot_completed_orders_view`
  105.                         WHERE
  106.                             TIME BETWEEN TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY)), INTERVAL -30 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)
  107.                         GROUP BY
  108.                           transaction_id,
  109.                           user_id
  110.                     ) AS r
  111.                     ON l.transaction_id = r.transaction_id
  112.                 )
  113.             )
  114.             WHERE TIME BETWEEN TIMESTAMP(DATETIME_ADD(DATETIME(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), 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)
  115.             GROUP BY
  116.                 DATE
  117.         )
  118.         WHERE DATE IS NOT NULL
  119.     )
  120. )
  121.  
  122.         ORDER BY DATE DESC
  123.         LIMIT 2500
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement