SQL UDF 中传递的参数数量限制是多少?

What is the limit on number of paramaters passed in a SQL UDF?

我正在尝试使用变体 table 将我提取的信息转换为 Snowflake,并使用我需要的计算数据创建一个新的 table。

例如我正在提取这些信息

数据列:

并且我想计算出这样的 table 作为输出:

团队 |Min_speed|Max_speed|Median_speed|Mean_speed|Average_speed|current_date

read here 您需要将 javascript 和 SQL UDF 分开,但找不到对我可以传递给 UDF 的参数数量的任何限制。

使用 python,我可以转换此信息,但我希望 table 超时插入它 - 我正在 s3 阶段探索 Lamdas,但现在我需要专注于udf 调用将新数据加载到 table 中。

CREATE OR REPLACE PROCEDURE SPEED_BY_GAME_DAY (team_id, sprint_speed)
LANGUAGE SQL
AS '
    INSERT INTO new_table VALUES(SELECT team_id, MIN(sprint_speed) as Min_speed, MAX(sprint_speed) as AVG(sprint_speed_) as AVG_speed, CURRENT_DATE() 
    FROM 
      tablename
    WHERE 
      CURRENT_DATE() = TODAY()
    GROUP BY team_id; )
';

这是正确的方向吗?

你的问题看起来像是一个理论练习。

某处显然存在实际最大值,您如何保持对数百个参数的监督?

如果你需要大量的参数,你可以将它们构造成一个 VARIANT 类型的参数,可以用 OBJECT_CONSTRUCT()ARRAY_CONSTRUCT() 构造。

如果数据以 Variant 类型可用,那么我们可以直接将数据展平以满足 objective 而无需通过 UDF 代码。

为了测试,我创建了一个 table with variant 列并添加了 team_id 和 sprint_speed 的记录。然后将这些记录展平以获得它们的值,这些值用于将记录插入 new_table.

create or replace table team_table1 (col1 variant)


create or replace table team_table2 
(team_id number, 
 min_sprint number (3,1), 
 max_sprint number (3,1),
 avg_sprint number (3,1),
 current_date date)

insert into team_table1
select parse_json(column1) as col1
from values 
( '
{
"team statistics": 
{
"stats": [
{
"team_Id": "109",
"sprint_Speed": "30.8"
}
]
}
}') as valinsert 

insert into team_table1
select parse_json(column1) as col1
from values 
( '
{
"team statistics": 
{
"stats": [
{
"team_Id": "120",
"sprint_Speed": "30.4"
}
]
}
}') as valinsert 

insert into team_table1
select parse_json(column1) as col1
from values 
( '
{
"team statistics": 
{
"stats": [
{
"team_Id": "142",
"sprint_Speed": "30.3"
}
]
}
}') as valinsert 




insert into team_table2
with cte as (
SELECT *
FROM (
SELECT
SEQ,
VALUE['team_Id']::number AS team_Id,
VALUE['sprint_Speed']::number(3,1) AS sprint_speed
from team_table1,
LATERAL FLATTEN(INPUT => COL1['team statistics']['stats'])
ORDER BY SEQ, INDEX
) 
)

select 
team_Id,
MIN(sprint_speed), 
MAX(sprint_speed),
AVG(sprint_speed), 
CURRENT_DATE 
FROM cte  
GROUP BY team_id;

select * from team_Table2;