У меня есть следующие 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 $
Спасибо всем!