【发布时间】:2019-03-13 04:56:37
【问题描述】:
#EDIT - 在 cmets 之后,我重新表述我的问题
我有一个 BigQuery 表,我想用它来获取我的应用程序的一些 KPI。 在此表中,我将每个创建或更新保存为一个新行,以保持更好的历史记录。 所以我有好几次相同的数据具有不同的状态。
表格示例:
uuid |status |date
––––––|–––––––––––|––––––––––
3 |'inactive' |2018-05-12
1 |'active' |2018-05-10
1 |'inactive' |2018-05-08
2 |'active' |2018-05-08
3 |'active' |2018-05-04
2 |'inactive' |2018-04-22
3 |'inactive' |2018-04-18
我们可以看到每个数据都有多个值。
我想得到什么:
我想知道当前“活动”条目的数量(因此之后必须没有具有相同 uuid 的“非活动”条目)。为了使一切复杂化,我需要每天的总数。 因此,对于每一天,“活跃”条目的数量,包括前几天的条目。
所以有了这个例子,我应该得到这个结果:
date | actives
____________|_________
2018-05-02 | 0
2018-05-03 | 0
2018-05-04 | 1
2018-05-05 | 1
2018-05-06 | 1
2018-05-07 | 1
2018-05-08 | 2
2018-05-09 | 2
2018-05-10 | 3
2018-05-11 | 3
2018-05-12 | 2
实际上,我已经设法在一天内获得了大量的活性物质。 但我的问题是我什么时候想要每天的结果。
我的尝试:
我被两种解决方案所困扰,每种解决方案都返回不同的错误。
第一个解决方案:
WITH
dates AS(
SELECT GENERATE_DATE_ARRAY(
DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH), CURRENT_DATE(), INTERVAL 1 DAY)
arr_dates )
SELECT
i_date date,
(
SELECT COUNT(uuid)
FROM (
SELECT
uuid, status, date,
RANK() OVER(PARTITION BY uuid ORDER BY date DESC) rank
FROM users
WHERE
PARSE_DATE("%Y-%m-%d", FORMAT_DATETIME("%Y-%m-%d",date)) <= i_date
)
WHERE
status = 'active'
and rank = 1
## rank is the condition which causes the error
) users
FROM
dates, UNNEST(arr_dates) i_date
ORDER BY i_date;
带有 RANK() OVER 的 SELECT 正确返回具有排名列的用户,该列允许我知道哪个条目是每个 uuid 的最后一个条目。
但是当我尝试这个时,我得到了:
Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN. 因为 rank = 1 条件。
第二种解决方案:
WITH
dates AS(
SELECT GENERATE_DATE_ARRAY(
DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH), CURRENT_DATE(), INTERVAL 1 DAY)
arr_dates )
SELECT
i_date date,
(
SELECT
COUNT(t1.uuid)
FROM
users t1
WHERE
t1.date = (
SELECT MAX(t2.date)
FROM users t2
WHERE
t2.uuid = t1.uuid
## Here that's the i_date condition which causes problem
AND PARSE_DATE("%Y-%m-%d", FORMAT_DATETIME("%Y-%m-%d", t2.date)) <= i_date
)
AND status='active' ) users
FROM
dates,
UNNEST(arr_dates) i_date
ORDER BY i_date;
在这里,第二个选择也可以正常工作,并正确返回当天的活跃用户数。
但问题是当我尝试使用 i_date 来检索多天内的数据时。
在这里我得到了一个LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join. 错误...
哪种方案更能成功?我应该改变什么?
而且,如果我存储数据的方式不好,我应该如何继续以保持准确的历史记录?
【问题讨论】:
-
请编辑您的问题以显示您遇到问题的代码的Minimal, Complete, and Verifiable example,然后我们可以尝试帮助解决具体问题。你也可以阅读How to Ask。
-
谢谢@MikhailBerlyant,我用自己的进步重新表述了整个问题,希望现在可以了。
标签: sql google-bigquery google-data-studio