假设我有一个包含列date | group_id | user_id | text
的表,我想获取每个group_id/user_id
对的前3个文本(按日期)。
每隔3小时查询整个表似乎很浪费,因为一旦设置给定对,结果就不太可能改变,所以我查看了实例化视图,但是示例仅涉及single rows,而不是设置行。
另一个问题是date
列与提取日期不对应,这是否意味着我必须添加一个提取日期列才能在预定查询中使用@run_time
? / p>
或者,将批处理加载到单独的表上,将其与“第一个/物化的”表进行比较/更新,然后再与主表合并,是否更明智? (因此,不要在主表上查询,而是在每次加载时先填充物化表)。看起来是 hacky / wrong 吗?
答案 0 :(得分:0)
该问题链接到I want a "materialized view" of the latest records,并提到它处理的是单行而不是多行。问题说,它希望最新的3行而不是仅1行。
为此,请查看该答案中的内部查询。而不是这样做:
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
# change to CURRENT_TIMESTAMP() or let scheduled queries do it
AND datehour > '2000-01-01' # nag
AND wiki='en' AND title LIKE 'A%'
GROUP BY title
)
执行以下操作:
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 3)[OFFSET(0)] latest_row
FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
# change to CURRENT_TIMESTAMP() or let scheduled queries do it
AND datehour > '2000-01-01' # nag
AND wiki='en' AND title LIKE 'A%'
GROUP BY title
)
Re @run_time
-您可以将其与任何列进行比较,只需确保有一个对您要实现的逻辑有意义的列即可。