在Redshift中使用python UDF中的表



我需要在redshift中创建一个python UDF(用户定义函数(,它将在其他过程中调用。这个python UDF采用两个日期值,比较给定开始日期和结束日期内的这些日期,并检查这些中间日期在某些list中是否出现。此列表需要从另一个表的列中收集其值。现在的问题是,python UDF是用plpythonplu语言定义的,它们不识别任何sql。我应该怎么做才能使这个列表脱离表的列?

这是我的功能:

create or replace function test_tmp (ending_date date, starting_date date)
returns integer
stable
as $$
def get_working_days(ending_date , starting_date ):
days=0
if start_date is not None and end_date is not None:
for n in range(int ((ending_date - starting_date).days)):
btw_date= (start_date + timedelta(n)).strftime('%Y-%m-%d')
if btw_date in date_list:
days=days+1
return days
return 0
return get_working_days(ending_date,starting_date)
$$ language plpythonu;

现在,我需要创建这个date_list,如下所示:

date_list = [str(each["WORK_DATE"]) for each in (select WORK_DATE from public.date_list_table).collect()]

但是,在函数中使用这一行显然会产生错误,因为select WORK_DATE from public.date_list_table是SQL。

以下是表public.date_list_table:的结构

CREATE TABLE public.date_list
(
work_date date ENCODE az64
)
DISTSTYLE EVEN;

该表的一些示例值(实际上,该表仅存储全年的工作日值(:

insert into date_list_table values ('2021-07-01'),('2021-06-30'),('2021-06-29');

亚马逊红移标量SQL UDF-亚马逊红移无法访问任何表。它需要通过将所有必要的信息传递到函数中来实现自包含。或者,您可以将日期信息存储在函数中,这样它就不需要访问该表(这并非不合理,因为它只需要保存例外情况,如工作日的公共假日(。

您的用例似乎是计算两个日期之间的工作天数。传统上解决这一问题的一种方法是创建一个表日历,其中每天一行,列提供以下信息:

  • 工作日(布尔值(
  • 周末(布尔值(
  • 公共假日(布尔值(
  • 月份
  • 季度
  • 一年中的某一天
  • 等等

然后,您可以加入或查询表以识别所需的信息,例如:

SELECT COUNT(*) FROM calendar WHERE work_day AND date BETWEEN start_date AND end_date

相关内容

  • 没有找到相关文章

最新更新