0

我正在尝试创建一个 UDF,它将为每个作为参数传递给 UDF 的表找到名为“DatePartition”的字段的最大值。我创建的 UDF 如下所示:

CREATE TEMP FUNCTION maxDatePartition(x STRING) AS ((
  SELECT MAX(DatePartition) FROM x WHERE DatePartition >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 7 DAY)
));

但我收到以下错误:“表名“x”缺少数据集,而请求中未设置默认数据集。”

表名将以以下格式传递给 UDF:

my-project.my-dataset.my-table

编辑:添加更多上下文:我有多个表,每天早上用昨天的数据更新。有时表格的更新时间比预期的要晚,所以我正在创建一个视图,允许用户快速查看每个表格中的最新数据。为此,我需要在一个语句中计算所有这些表的 MAX(DatePartition)。表列表将存储在另一个表中,但它会不时更改,因此我无法对其进行硬编码。

4

1 回答 1

0

我曾尝试在单个语句中执行此操作,但发现我需要调用公用表表达式作为排序机制。我在 TIMESTAMP 上使用 MAX() 函数没有成功。这是我发现的最适合我的方法(也是最简洁的)。不需要UDF。尝试这样的事情:

WITH
  DATA AS (
SELECT
  ROW_NUMBER() OVER (PARTITION BY your_group_by_fields ORDER BY DatePartition DESC) AS _row,
  *
FROM
  `my-project.my-dataset.my-table` 
WHERE
  Date_Partition >= TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 7 DAY)
)

SELECT
* EXCEPT(_row)
FROM
  DATA
WHERE
  _row = 1;

这样做是为具有不同时间戳的多个记录的任何分组字段的每个分区创建一个带有行号的新字段。因此,对于某个组的每条记录,它将按最近的 DatePartition 对它们进行排序,并给它们一个行号值,其中“1”是自我们对 DatePartition DESC 进行排序以来的最新记录。

然后它采用排序值的公用表表达式,并返回表中的所有内容(除了您分配的行号“_row”),然后仅过滤“_row =1”,这将是您最近的记录。

于 2020-12-20T05:11:04.147 回答