0

我在航空公司应用程序中有一个搜索数据表。我想编写一个查询,输出仅搜索纽约一个机场而不搜索纽约任何其他机场的访客数量。所以基本上计算出搜索一个机场而不尝试纽约任何其他机场的人数。

假设纽约机场是 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 将是我希望将其包括在那些确实扩展搜索的人的计数中的人。

基本上我想要一个计数:

  • 没有扩展搜索,也没有预订
  • 确实扩展了搜索但没有预订
  • 确实扩展了搜索并预订了

希望一切都有意义?任何帮助将非常感激!

4

2 回答 2

3

以下是 BigQuery 标准 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 - 所以我在过滤中同时使用了 searched_to 和 searched_from。如果需要,您可以删除 search_from 的过滤器

于 2018-04-30T13:44:49.767 回答
0

试试这个进行第一次查询。
请检查此查询是否提供所需的输出。

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;

通过一些修改,第二个和第三个查询就可以使用了。自己试试。

于 2018-04-30T13:12:24.703 回答