BigQuery-SQL - объединение двух таблиц для расчета выручки - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующие 2 таблицы:

Таблица1 - необработанные данные без данных о доходах:

datehour | geo | platform | dimension_4 | dimension_5
metric_1 | metric_2 | billable_actions (int)

Таблица2 - данные о доходах, которые получены из другого источника, но в конечном итоге вставлены втаблица со следующей схемой (обратите внимание, что в ней отсутствуют 2 измерения):

datehour | geo | platform | revenue (float)

Мне нужно объединить Table2 в Table1, чтобы я мог рассчитать доход только из таблицы 1.

ЗАПРОС

SELECT
 datehour,
 cc,
 platform,
 dimension_1,
 dimension_2,
 billable_actions,
 CASE
   WHEN revenue > 0 AND billable_actions > 0 THEN (revenue/total_billable_actions)*billable_actions
   WHEN metric_1 IS NULL AND metric_2 IS NULL THEN revenue
   ELSE 0
 END calc_revenue
FROM (
 SELECT
   IFNULL(e.datehour,d.from_ts) datehour,
   IFNULL(e.cc, d.cc) cc,
   IFNULL(e.platform, d.platform) platform,
   e.dimension1,
   e.dimension2,
   e.billable_actions,
   SUM(e.billable_actions) OVER (PARTITION BY e.datehour, e.platform, e.geo) total_billable_actions,
   d.revenue
 FROM Table1 e
 FULL JOIN Table2 d
 ON
  e.datehour = d.from_ts AND
  e.appkey = d.appkey AND
  e.cc = d.cc AND
  e.platform = d.platform
)

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ И ПРОБЛЕМА

Доходы обеих таблиц должны быть равны после объединения.Я тестирую:

select sum(revenue) from Table2 ==
select sum(row_revenue) from JoinedTable

, но row_revenue всегда меньше: Table2 sum = 0.44449199771042913 Сумма объединенной таблицы = 0.4421989977126941

Может кто-нибудь указать мне причину, по которой они не равны?У меня есть рабочий пример в конце вопроса.

ПРИМЕЧАНИЯ

примечание 1 - доход рассчитывается следующим образом:

1) Таблица 1 ПОЛНОЕ СОЕДИНЕНИЕ Таблица 2 ВКЛ .:

T1.datehour = T2.datehour AND
T1.geo = T2.geo AND
T1.platform = T2.platform

* ознакомьтесь, пожалуйста, с примечанием 2,3 относительно того, почему я использую полное объединение.

2) в таблице 1, суммируйте подлежащую оплатедействия, разбить по дате, часу, гео и платформе.

SUM(billable_actions) OVER (PARTITION BY datehour, geo, platform)  
AS total_billable_actions

3) Теперь у нас есть таблица, в которой каждая строка содержит total_billable_actions для группы, общий доход и общее количество действий для строки.обернуть его другим выбором и вычислить доход строки:

row_revenue = (revenue / total_billable_actions) * billable_actions

note 2 у нас могут быть строки из Table1, которые не соответствуют ни одной строке из table2, но нам все еще нужны найденные данныев этих рядах.эти строки не влияют на расчеты выручки.

примечание 3 у нас могут быть строки из таблицы 2, которые также не соответствуют соединению.нам нужны эти строки, не тронутые, с тем же доходом.

note 4 с учетом проблем с плавающей запятой: BigQuery использует 8-байтовую двойную точность для float, и я умножил все результаты на большие числа(1000, 1000000), чтобы выяснить, является ли проблема точностью десятичной запятой.Кажется, что умножение результата дает тот же самый точный результат.

рабочий пример

для простоты я вынул одно измерение и другие метрики.

левый стол:

datehour   geo   platform   dimension_1   billable_actions
15:00      US    Android    shmoo         10
15:00      US    Android    foo           5
15:00      US    IOS        shmoo         8
15:00      US    IOS        foo           4
15:00      US    UNKNOWN    shmoo         4

правый стол:

datehour  geo      platform   revenue
15:00     US       Android    5$
15:00     US       IOS        10$
15:00     UNKNOWN  IOS        2$

объединенный стол:

15:00   US      Android    shmoo         10  15  (5$/15)*10 = 3.333..3
15:00   US      Android    foo           5   15  (5$/15)*5 = 1.6666..7
15:00   US      IOS        shmoo         8   12  (10$/12)*8 = 6.6666..7
15:00   US      IOS        foo           4   12  (10$/12)*4 = 3.3333..3
15:00   US      UNKNOWN    shmoo         4   4   0$
15:00   UNKNOWN IOS        null          0   0   2$

сумма (row_revenue) = 17 $

Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...