Google Bigquery Standard SQL - 已搜索目的地但未预订的 ID 计数
Google Bigquery Standard SQL - Count of id that have searched for destination and not booked
我在航空公司应用程序中有 table 搜索数据。
我想编写一个查询,输出仅搜索纽约一个机场而不搜索纽约任何其他机场的访客数量。所以基本上计算出搜索一个机场的人数,不要尝试纽约的任何其他机场。
假设纽约机场是 JFK、LGA、EWR 和 MSY。
Table 看起来类似于:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 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 将是我希望包括在那些确实扩展了他们的搜索的计数中的人。
基本上我想要一个数:
- 没有扩展搜索也没有预订
- 扩展了搜索但没有预订
- 扩展搜索并完成预订
希望一切都有意义?任何帮助将不胜感激!
第一次查询时试试这个。
请检查此查询是否提供了所需的输出。
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;
经过一些修改,第二个和第三个查询就可以使用了。亲自尝试一下。
以下适用于 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
这将 return
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 的过滤器
我在航空公司应用程序中有 table 搜索数据。 我想编写一个查询,输出仅搜索纽约一个机场而不搜索纽约任何其他机场的访客数量。所以基本上计算出搜索一个机场的人数,不要尝试纽约的任何其他机场。
假设纽约机场是 JFK、LGA、EWR 和 MSY。
Table 看起来类似于:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 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 将是我希望包括在那些确实扩展了他们的搜索的计数中的人。
基本上我想要一个数:
- 没有扩展搜索也没有预订
- 扩展了搜索但没有预订
- 扩展搜索并完成预订
希望一切都有意义?任何帮助将不胜感激!
第一次查询时试试这个。
请检查此查询是否提供了所需的输出。
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;
经过一些修改,第二个和第三个查询就可以使用了。亲自尝试一下。
以下适用于 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
这将 return
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 的过滤器