【发布时间】:2018-11-13 07:43:09
【问题描述】:
我有一个 SQL Server 查询,我正在尝试将其转换为在 BigQuery 中运行。涉及三个表:
日历月
FirstDayOfMonth | FirstDayOfNextMonth
----------------------------+----------------------------
2017-02-01 00:00:00.000 UTC | 2017-03-01 00:00:00.000 UTC
2017-03-01 00:00:00.000 UTC | 2017-04-01 00:00:00.000 UTC
客户
clientid | name | etc.
---------+----------------+------
1 | Bob's Shop |
2 | Anne's Cookies |
客户端日志
id | clientid | timestamp | price_current | price_old | license_count_current | license_count_old |
----+----------+----------------+---------------+-----------+-----------------------+---------------
1 | 1 | 2017-02-01 UTC | 1200 | 0 | 10 | 0 |
2 | 1 | 2018-02-03 UTC | 2400 | 1200 | 20 | 10 |
3 | 2 | 2016-07-13 UTC | 1200 | 0 | 10 | 0 |
4 | 2 | 2018-03-30 UTC | 0 | 1200 | 0 | 10 |
T-SQL 查询如下所示:
SELECT
FirstDayOfMonth, FirstDayOfNextMonth,
(SELECT SUM(sizeatdatelog.price_current)
FROM clients c
CROSS APPLY (SELECT TOP 1 *
FROM clientlogs
WHERE clientid = c.clientid
AND [timestamp] < cm.FirstDayOfMonth
ORDER BY [timestamp] DESC) sizeatdatelog
WHERE sizeatdatelog.license_count_current > 0) as StartingRevenue,
(another subquery for starting client count) as StartingClientCount,
(another subquery for churned revenue) as ChurnedRevenue,
(there are about 6 other subqueries)
FROM
CalendarMonths cm
ORDER BY
cm.FirstDayOfMonth
最终输出如下:
FirstDayOfMonth | FirstDayOfNextMonth | StartingRevenue | StartingClientCount | etc
-------------------------------------------------------------------------------------------------------
2017-02-01 00:00:00.000 UTC | 2017-03-01 00:00:00.000 UTC | 68382995.43 | 79430 |
2017-03-01 00:00:00.000 UTC | 2017-04-01 00:00:00.000 UTC | 69843625.12 | 80430 |
在 BigQuery 中,我在 select 子句中添加了一个简单的子查询,效果很好:
SELECT FirstDayOfMonth, FirstDayOfNextMonth, (SELECT clientId FROM clientlogs LIMIT 1 ) as cl
FROM CalendarMonths cm
ORDER BY cm.FirstDayOfMonth
但是,一旦我向子查询添加 where 子句,我就会收到以下错误消息:
错误:不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。
我应该如何从这一点着手?如果我无法在一个查询中获得我正在寻找的结果,也许我应该考虑创建多个创建临时表的计划作业,然后将它们连接在一起的最终计划作业。或者,也许我可以考虑通过 GCP 在代码中执行此操作,或者在应用脚本中使用 BigQuery API。数据量不大,查询也不经常运行。我在寻找可维护性而不是效率,所以理想情况下有一种方法可以将这些数据放入一个查询中。
【问题讨论】:
-
BigQuery - Complex Correlated query 的可能重复项查看此处显示的答案并检查那里的答案是否适合您。
标签: google-bigquery