Snowflake cloud data platform &引用;无法计算不支持的子查询类型";在雪花UDF中使用两种不同的日期比较
在Snowflake中,我在使用UDF时出现了上述错误(这是一个完全合法的查询):Snowflake cloud data platform &引用;无法计算不支持的子查询类型";在雪花UDF中使用两种不同的日期比较,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,在Snowflake中,我在使用UDF时出现了上述错误(这是一个完全合法的查询): SELECT dd.date, person_count(dd.date) AS cnt FROM dim_date dd WHERE dd.date BETWEEN '2019-11-01' and '2019-11-07' 基本上,这是可行的: CREATE OR REPLACE FUNCTION person_count(d date) RETURNS number AS $$
SELECT
dd.date,
person_count(dd.date) AS cnt
FROM dim_date dd
WHERE dd.date BETWEEN '2019-11-01' and '2019-11-07'
基本上,这是可行的:
CREATE OR REPLACE FUNCTION person_count(d date)
RETURNS number
AS
$$
SELECT COUNT(DISTINCT person_id)
FROM persons
WHERE (deceased_date > d)
$$;
这就产生了错误:
CREATE OR REPLACE FUNCTION person_count(d date)
RETURNS number
AS
$$
SELECT COUNT(DISTINCT person_id)
FROM persons
WHERE (deceased_date = '1901-01-01' OR deceased_date > d)
$$;
我已尝试在日期字符串上使用
来指定日期。我尝试过使用死亡日期,并且尝试过将所有日期转换为字符串。似乎什么都不管用。我认为这可能是一个bug。同意第一个代码可以工作
create or replace table persons (person_id number, deceased_date date);
insert into persons values (1,'2019-10-01'),(1,'2019-09-01'),(2,'1901-01-01'),(3,'2019-11-04');
SELECT COUNT(DISTINCT person_id)
FROM persons
WHERE (deceased_date = '1901-01-01' OR deceased_date > '2019-11-04');
CREATE OR REPLACE FUNCTION person_count(d date)
RETURNS number
AS
$$
SELECT COUNT(DISTINCT person_id)
FROM persons
WHERE (deceased_date > d)
$$;
select column1 as date
,person_count(column1) as cnt
from values ('2019-11-01'), ('2019-11-02'), ('2019-11-03'), ('2019-11-04'), ('2019-11-05'), ('2019-11-06'), ('2019-11-07')
order by 1;
但这些替代方案并不适用。
创建或替换功能人员计数(d日期)
返回号码
作为
$$
选择计数(不同的人员\u id)
来自个人
其中(已故日期='1901-01-01'或已故日期>d)
$$;
CREATE OR REPLACE FUNCTION person_count(d date)
RETURNS number
AS
$$
SELECT COUNT(DISTINCT person_id)
FROM (
SELECT person_id FROM PERSONS WHERE deceased_date > d
UNION
SELECT person_id FROM PERSONS WHERE deceased_date = '1901-01-01'
)
$$;
原因是,当他们扩展函数时,他们将其转换为一个相关子查询(即使它可以作为一个连接来完成),并且只处理非常简单的相关子查询,而您无法控制这一点。当我们想使用表函数作为查找表时,我们就碰到了这个问题。在一个地方,我们只是推出了一个CASE语句来避免查找(gross),在另一个地方,我们使用Javascript udf进行查找
但它基本上是一个bug,所以我要报告它。问题是子查询支持中的OR谓词存在一些限制 我相信UDF与错误无关。似乎Snowflake尽可能在查询解析过程中进行语法替换,在本例中,结果是:
SELECT
dd.date,
(SELECT COUNT(DISTINCT person_id)
FROM persons
WHERE (deceased_date = '1901-01-01' OR deceased_date > dd.date)) AS cnt
FROM dim_date dd
WHERE dd.date BETWEEN '2019-11-01' and '2019-11-07';
这会产生完全相同的错误。如前所述,只有当存在多个WHERE条件时,这才失败
对于Snowflake来说,使用子查询(相关或非相关)结合多条件过滤的查询解析似乎是一个持续的问题,例如……感谢您的回复。接下来我将讨论雪花支持。对于下面的人,我联系了支持人员,他们说ORs在子查询中不受支持,因为它们进行了一些优化。他们声称他们正在致力于支持“一些子查询类型”,这些子查询类型将在明年推出。