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

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

Предположим, что аэропортами Нью-Йорка являются 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 - это тот, кого я хотел бы включить в подсчет тех, кто продлил поиск.

По сути, я хотел бы подсчитать:

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

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Ниже для BigQuery Standard SQL

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

#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 должен быть включен - поэтому я использовал и фильтрацию seek_to, и seek_from. при необходимости вы можете удалить фильтр для search_from

0 голосов
/ 30 апреля 2018

Попробуйте это для 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-й запрос будут готовы к использованию. Попробуйте сами.

...