BigQuery:标准 SQL 中的 PI()

Posted

技术标签:

【中文标题】BigQuery:标准 SQL 中的 PI()【英文标题】:BigQuery: PI() in Standard SQL 【发布时间】:2017-01-11 10:03:24 【问题描述】:

我使用 Google BigQuery 的旧版 SQL 已经有一段时间了,当我需要数字 Pi 时,有一个方便的 PI() 函数:

SELECT PI()

但是在标准 SQL 中,这个函数不再存在。我一直无法在文档中找到等效的功能。在标准 SQL 中拥有等效的 PI() 函数的最简单、最准确的方法是什么?

【问题讨论】:

我已经删除了 sql-server 标签,我不应该包含它。我正在寻找这个函数,专门使用 BigQuery 的标准 SQL 语言。 【参考方案1】:

另一种选择是使用内置三角函数 - -1 的反余弦正好是 PI:

SELECT ACOS(-1)

结果

Row f0_  
1   3.141592653589793

如果您在查询中使用 ACOS(-1),优化器会自动将其常量折叠并仅计算一次。

【讨论】:

我希望我可以多次投票支持相同的答案!这个绝对值得! 同意米哈伊尔!聪明的。这肯定是公认的答案!尽管我的回答目前获得最多票 ;-) @Konrad - 你看到了吗?【参考方案2】:

你似乎是对的。我在标准 SQL 中也找不到对应的 PI 函数。

https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#mathematical-functions

也许 Google 员工可以确认它在标准 SQL 中尚不可用。但在那之前,作为一种解决方法,使用非常简单的 UDF 怎么样?这有点笨拙,但可能会奏效:

CREATE TEMPORARY FUNCTION PI()
RETURNS FLOAT64
LANGUAGE js AS """
  return Math.PI;
""";
SELECT PI() as PI

旧版 SQL 作为比较:

【讨论】:

谢谢,这也是 Google 支持部门回复我的。【参考方案3】:

您可以定义一个 SQL 函数,这比使用 javascript 开销更少:

CREATE TEMP FUNCTION PI() AS (3.141592653589793);

如果拥有这样的常量对您很重要,您可以在 issue tracker 上找到功能请求。

【讨论】:

【参考方案4】:

BigQuery 中现在有一个名为 bqutil.fn.pi() 的实用程序函数,它将返回 pi 的值。

你可以这样使用它:

SELECT bqutil.fn.pi() AS pi

这里有一个screenshot 正在运行。

【讨论】:

以上是关于BigQuery:标准 SQL 中的 PI()的主要内容,如果未能解决你的问题,请参考以下文章

标准 sql 中的 bigquery 旧版 sql POSITION() 函数

BigQuery 标准 SQL 中的 JSON_EXTRACT?

BigQuery 标准 SQL 中的“yearweek”函数的等价物是啥?

Google BigQuery 中的 TIMESTAMP 和标准 SQL

标准 sql 中的 BigQuery 过滤记录

标准 SQL 中的 BigQuery 连接数组