Snowflake cloud data platform &引用;无法计算不支持的子查询类型";在雪花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 $$

在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 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在子查询中不受支持,因为它们进行了一些优化。他们声称他们正在致力于支持“一些子查询类型”,这些子查询类型将在明年推出。