У меня есть запрос SQL Server, который я пытаюсь преобразовать для запуска в BigQuery.Здесь задействованы три таблицы:
CalendarMonths
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 |
ClientLogs
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 или использовать API BigQuery в сценариях приложения.Размер данных невелик, и запрос выполняется не часто.Мне нужно удобство обслуживания, а не эффективность, поэтому в идеале есть способ объединить эти данные в один запрос.