Условное агрегирование больших данных - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть быстрый вопрос, против которого я пытаюсь ударить головой, но безуспешно:

Допустим, у меня есть следующая таблица:

+-----+----------------+-----+-------+------+------+------+-------+
| Row | Promotion Name | Day | Month | Year | SENT | Open | Click |
+-----+----------------+-----+-------+------+------+------+-------+
|   1 | Email_New_V1   |   1 |     2 | 2019 |    3 |    2 |     1 |
|   2 | Email_New_V2   |   1 |     2 | 2019 |    5 |    2 |     1 |
|   3 | Email_New_V3   |   2 |     2 | 2019 |    4 |    2 |     1 |
+-----+----------------+-----+-------+------+------+------+-------+

По сути, я хочу итоговые значения SENT, OPEN и CLICK за каждый день (день 1, день 2 и т. д. c ...) и месяц (месяц 1, т. 2 и т. c.) .. агрегированные по первым нескольким символам в Название рекламного мероприятия (Email_New%)

По сути, у меня было бы следующее:

 +----------------+-----+-------+------+------+------+-------+
    | Promotion Name | Day | Month | Year | SENT | Open | Click |
    +----------------+-----+-------+------+------+------+-------+
    | Email_New      |   1 |     2 | 2019 |   12 |    6 |     3 |
    +----------------+-----+-------+------+------+------+-------+

Я пытался использовать SUBSTR, чтобы выбрать первые несколько слов, но безрезультатно. Могу ли я получить чаевые?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Email_New_V1' promotion_name, 1 day, 2 month, 2019 year, 3 sent, 2 open, 1 click UNION ALL
  SELECT 'Email_New_V2', 1, 2, 2019, 5, 2, 1 UNION ALL
  SELECT 'Email_New_V3', 2, 2, 2019, 4, 2, 1 UNION ALL
  SELECT 'Email_Old_V1', 1, 2, 2019, 1, 2, 3 UNION ALL
  SELECT 'Email_Old_V2', 1, 2, 2019, 4, 5, 6 
), promotions AS (
  SELECT 'Email_New' promotion_name UNION ALL
  SELECT 'Email_Old'
)
SELECT p.promotion_name, 
  day, month, year, 
  SUM(sent) sent,
  SUM(open) open,
  SUM(click) click 
FROM `project.dataset.table` t
JOIN promotions p
ON STARTS_WITH(t.promotion_name, p.promotion_name)
GROUP BY promotion_name, day, month, year      

с выводом

Row promotion_name  day month   year    sent    open    click    
1   Email_New       1   2       2019    8       4       2    
2   Email_New       2   2       2019    4       2       1    
3   Email_Old       1   2       2019    5       7       9    
0 голосов
/ 25 февраля 2020

Если вы просто хотите удалить последние 3 символа и группу по полученной строке:

select 
    substring(promotion_name, -3) promotion_name,
    day,
    month,
    year,
    sum(sent) sent,
    sum(open) open,
    sum(click) click
from mytable
group by
    substring(promotion_name, -3),
    day,
    month,
    year

Если есть переменное количество символов и вы хотите удалить что-либо после последнего подчеркивания (включено) могут пригодиться функции регулярного выражения:

select 
    regexp_replace(promotion_name, '_[^_]+$', '') promotion_name,
    day,
    month,
    year,
    sum(sent) sent,
    sum(open) open,
    sum(click) click
from mytable
group by
    regexp_replace(promotion_name, '_[^_]+$', ''),
    day,
    month,
    year

'_[^_]+$' означает: подчеркивание, за которым следует хотя бы один символ, отличный от подчеркивания, затем конец строки.

...