Google Bigquery Standard SQL - количество идентификаторов, которые выполнили поиск пункта назначения, но не забронировали его

У меня есть таблица данных поиска в приложении авиакомпании. Я хочу написать запрос, который выводит количество посетителей, которые искали только один аэропорт в Нью-Йорке, а не какой-либо другой в Нью-Йорке. Так что по сути определите количество людей, которые ищут один аэропорт, и не пробуют другие аэропорты в Нью-Йорке.

Предположим, что аэропорты Нью-Йорка - это JFK, LGA, EWR и MSY.

Таблица будет выглядеть примерно так:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| visitor_id | searched_to | searched_from | booked|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|     11     |     JFK     |      LCY      |   N   |
|     11     |     LGA     |      LCY      |   N   |
|     11     |     EWR     |      LCY      |   N   |
|     12     |     JFK     |      LCY      |   N   |
|     13     |     MSY     |      LTN      |   Y   |
|     14     |     JFK     |      LTN      |   N   |
|     14     |     JFK     |      LGW      |   N   |
|     14     |     EWR     |      LCY      |   Y   |
|     15     |     GOA     |      MSY      |   N   |

например Посетители 12 и 15 - это те, кого я хотел бы включить в подсчет, если они не расширили свой поиск. например Посетитель 14 - это тот, кого я хотел бы включить в подсчет тех, кто продлил свой поиск.

По сути, мне нужно количество:

  • не расширял поиск и не бронировал
  • продлил поиск и не заказал
  • расширил поиск и заказал

Надеюсь, что все имеет смысл? Любая помощь приветствуется!

что ты уже испробовал? Также предоставьте ожидаемый результат.

Rahul Jain 30.04.2018 15:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это для 1-го запроса. Пожалуйста, проверьте, предоставляет ли этот запрос требуемый результат.

SELECT visitor_id, count(*)
FROM tableName t
WHERE search_to IN ('JFK', 'LGA', 'EWR', 'MSY')
AND NOT IN (SELECT visitor_id FROM tableName temp WHERE t.visitor_id = temp.visitor_id AND booked = 'Y' and search_to IN ('JFK', 'LGA', 'EWR', 'MSY'))
GROUP BY visitor_id
HAVING count(*) = 1;

С небольшими изменениями 2-й и 3-й запросы будут готовы к использованию. Попробуйте сами.

Спасибо за ответ, Рахул, это было не совсем то, что я искал

AK91 30.04.2018 20:13
Ответ принят как подходящий

Ниже приведен стандартный SQL BigQuery.

Первый шаг - выяснить, какой посетитель что сделал

#standardSQL
SELECT visitor_id, 'Y' = MAX(booked) booked,
  1 < COUNTIF(searched_to IN ('JFK', 'LGA', 'EWR', 'MSY') 
      OR searched_from IN ('JFK', 'LGA', 'EWR', 'MSY')) extended
FROM `project.dataset.your_table`
GROUP BY visitor_id  

если вы попробуете это с фиктивными данными, как показано ниже

WITH `project.dataset.your_table` AS (
  SELECT 11 visitor_id, 'JFK' searched_to, 'LCY' searched_from, 'N' booked UNION ALL
  SELECT 11, 'LGA', 'LCY', 'N' UNION ALL
  SELECT 11, 'EWR', 'LCY', 'N' UNION ALL
  SELECT 12, 'JFK', 'LCY', 'N' UNION ALL
  SELECT 13, 'MSY', 'LTN', 'Y' UNION ALL
  SELECT 14, 'JFK', 'LTN', 'N' UNION ALL
  SELECT 14, 'JFK', 'LGW', 'N' UNION ALL
  SELECT 14, 'EWR', 'LCY', 'Y' UNION ALL
  SELECT 15, 'GOA', 'MSY', 'N' 
)

результат будет как

Row visitor_id  booked  extended     
1   11          false   true     
2   12          false   false    
3   15          false   false    
4   13          true    false    
5   14          true    true     

следующий шаг - сделать окончательный подсчет

#standardSQL
SELECT extended, booked, COUNT(1) cnt
FROM (
  SELECT visitor_id, 'Y' = MAX(booked) booked,
    1 < COUNTIF(searched_to IN ('JFK', 'LGA', 'EWR', 'MSY') 
        OR searched_from IN ('JFK', 'LGA', 'EWR', 'MSY')) extended
  FROM `project.dataset.your_table`
  GROUP BY visitor_id
)
GROUP BY extended, booked    

это вернется

Row extended    booked  cnt  
1   false       false   2    
2   false       true    1    
3   true        true    1    
4   true        false   1     

Вы можете протестировать, поиграть со всем запросом, используя фиктивные данные из вашего вопроса

#standardSQL
WITH `project.dataset.your_table` AS (
  SELECT 11 visitor_id, 'JFK' searched_to, 'LCY' searched_from, 'N' booked UNION ALL
  SELECT 11, 'LGA', 'LCY', 'N' UNION ALL
  SELECT 11, 'EWR', 'LCY', 'N' UNION ALL
  SELECT 12, 'JFK', 'LCY', 'N' UNION ALL
  SELECT 13, 'MSY', 'LTN', 'Y' UNION ALL
  SELECT 14, 'JFK', 'LTN', 'N' UNION ALL
  SELECT 14, 'JFK', 'LGW', 'N' UNION ALL
  SELECT 14, 'EWR', 'LCY', 'Y' UNION ALL
  SELECT 15, 'GOA', 'MSY', 'N' 
)
SELECT extended, booked, COUNT(1) cnt
FROM (
  SELECT visitor_id, 'Y' = MAX(booked) booked,
    1 < COUNTIF(searched_to IN ('JFK', 'LGA', 'EWR', 'MSY') 
        OR searched_from IN ('JFK', 'LGA', 'EWR', 'MSY')) extended
  FROM `project.dataset.your_table`
  GROUP BY visitor_id
)
GROUP BY extended, booked    

Примечание: в заголовке вопроса вы упомянули searched for destination, но в самом вопросе вы упомянули посетителя № 15, который должен быть включен, поэтому я использовал для фильтрации и search_to, и search_from. при необходимости вы можете удалить фильтр для search_from

Другие вопросы по теме