如何将此代码从 oracle 转换为 redshift?
Posted
技术标签:
【中文标题】如何将此代码从 oracle 转换为 redshift?【英文标题】:How to convert this code from oracle to redshift? 【发布时间】:2019-08-08 02:29:42 【问题描述】:我正在尝试在 redshift 中实现相同的功能,但我发现要做到这一点并不困难。由于 redshift 位于 postgresql 引擎的顶部,如果有人可以在 postgresql 中做到这一点,那将非常有帮助。基本上,代码在列级别获取前两个月的计数。如果没有准确的上个月计数,则为 0。
这是我的代码:
with abc(dateval,cnt) as(
select 201908, 100 from dual union
select 201907, 200 from dual union
select 201906, 300 from dual union
select 201904, 600 from dual)
select dateval, cnt,
last_value(cnt) over (order by dateval
range between interval '1' month preceding
and interval '1' month preceding ) m1,
last_value(cnt) over (order by dateval
range between interval '2' month preceding
and interval '2' month preceding ) m2
from (select to_date(dateval, 'yyyymm') dateval, cnt from abc)
我在 over by 子句中出现错误。我试图给演员('1个月'作为间隔)但仍然失败。有人可以帮我解决这个 windows 功能吗?
预期输出:
问候
【问题讨论】:
请使用标签下方的edit
按钮编辑您的问题,并举例说明您在 PostgreSQL/Redshift 中的尝试。谢谢。
Redshifts 窗口函数不支持RANGE
,因此您只能定义基于行的窗口 (ROWS BETWEEN ...
),这很可惜。由于您对过去 2 个月的值感兴趣,我将创建一个连续月份的序列表,然后使用月份创建一个序列表 LEFT JOIN
你的 abc
表以获取允许您使用行的连续日期范围基于窗口。然后你分别做LAG(cnt,1)
和LAG(cnt,2)
。
我会在我的电脑前给你举个例子
添加了输出@botchniaque
【参考方案1】:
我会这样做。在 Redshift 中没有简单的方法来生成序列,我是否从任意表中选择 row_number()
来创建序列:
with abc(dateval,cnt) as(
select 201908, 100 union
select 201907, 200 union
select 201906, 300 union
select 201904, 600),
cal(date) as (
select
add_months(
'20190101'::date,
row_number() over () - 1
) as date
from <an arbitrary table to generate a sequence of rows> limit 10
),
with_lag as (
select
dateval,
cnt,
lag(cnt, 1) over (order by date) as m1,
lag(cnt, 2) over (order by date) as m2
from abc right join cal on to_date(dateval, 'YYYYMM') = date
)
select * from with_lag
where dateval is not null
order by dateval
【讨论】:
这是有用的。只是想知道是否存在其他一些维度并根据该谷物上一个月份来计算以上是关于如何将此代码从 oracle 转换为 redshift?的主要内容,如果未能解决你的问题,请参考以下文章
如何将此代码从 Intel(nasm) 转换为 AT&T(gas) 语法?
如何将此混合行/列表转换为所需的输出。 (Oracle SQL/发行版:Ora12c)
Vue-Select:如何将此 fetch() 代码转换为使用 axios?