Google Bigquery Standard SQL - 已搜索目的地但未预订的 id 计数

Posted

技术标签:

【中文标题】Google Bigquery Standard SQL - 已搜索目的地但未预订的 id 计数【英文标题】:Google Bigquery Standard SQL - Count of id that have searched for destination and not booked 【发布时间】:2018-04-30 12:59:45 【问题描述】:

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

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

基本上我想要一个计数:

未扩展搜索且未预订 已扩展搜索但未预订 确实扩展了搜索并预订了

希望这一切都有意义吗?任何帮助将不胜感激!

【问题讨论】:

到目前为止您尝试过什么?另外,提供预期的输出。 【参考方案1】:

以下是 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 的过滤器

【讨论】:

【参考方案2】:

尝试第一次查询。 请检查此查询是否提供所需的输出。

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;

稍作修改,第二个和第三个查询就可以使用了。自己试试吧。

【讨论】:

感谢您的回复拉胡尔,只是不是我想要的

以上是关于Google Bigquery Standard SQL - 已搜索目的地但未预订的 id 计数的主要内容,如果未能解决你的问题,请参考以下文章

什么 DataGrip SQL Dialect 最接近 BigQuery STANDARD SQL (SQL 2011)

BigQuery数据类型

无法使用 google bigquery(标准)取消嵌套某些字段

BigQuery INSERT DML 语句限制

BigQuery 中的多个左连接

BigQuery 类型中有多少字节