Представим, что у меня есть сайт по продаже электроники. Чтобы привлечь клиентов, я вложил немного денег в рекламные кампании в Интернете.

В следующей таблице есть три столбца: user_id (идентификатор, который идентифицирует каждого пользователя), event_date (дата, когда пользователь нажал на объявление) и mkt campaign (название рекламной кампании):

|user_id| event_date|mkt campaign
|   1   | 25-11-2021|FB - Black Friday
|   2   | 20-12-2020|G Display - Christmas campaign
|   1   | 22-12-2019|G Display - Christmas campaign 
|   3   | 12-10-2020|Whatsapp - July - campaign
|   2   | 01-08-2018|IG Post - Holidays campaign
|   3   | 30-08-2020|FB - Holidays campaign

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

Ожидаемый результат будет таким:

 |user_id| event_date|mkt campaign
 |   1   | 22-12-2019|G Display - Christmas campaign
 |   2   | 01-08-2018|IG Post - Holidays campaign
 |   3   | 30-08-2020|FB - Holidays campaign

Я знаю, что могу использовать ORDER BY event_date ASC для сортировки строк по дате. Однако мне нужен результат, чтобы отображался только один результат на user_id (тот, у которого была самая старая кампания).

А вы знаете, как это сделать в BigQuery (BQ Standard SQL)?

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

2
programmer987 27 Ноя 2021 в 00:00

1 ответ

Лучший ответ

Рассмотрим ниже подход

select * from your_table where true
qualify 1 = row_number() over(partition by user_id order by parse_date('%d-%m-%Y', event_date))          

Если применимо к образцам данных в вашем вопросе, как

with your_table as (
  select 1 user_id, '25-11-2021' event_date, 'FB - Black Friday' mkt_campaign union all
  select 2, '20-12-2020', 'G Display - Christmas campaign' union all
  select 1, '22-12-2019', 'G Display - Christmas campaign ' union all
  select 3, '12-10-2020', 'Whatsapp - July - campaign' union all
  select 2, '01-08-2018', 'IG Post - Holidays campaign' union all
  select 3, '30-08-2020', 'FB - Holidays campaign' 
)      

Выход

enter image description here

1
Mikhail Berlyant 27 Ноя 2021 в 00:25
Спасибо за помощь! Я все еще пытаюсь понять, что означает «квалификация 1». Это номер строки в соответствии со следующими критериями: «row_number () over (разделение по user_id в порядке parse_date ('% d-% m-% Y', event_date))»?
 – 
programmer987
27 Ноя 2021 в 01:33
Да. Точно. Он отфильтровывает все, кроме соответствующих первых строк
 – 
Mikhail Berlyant
27 Ноя 2021 в 02:11