如何将此代码从 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)

如何将此代码转换为 PyQt5?

Vue-Select:如何将此 fetch() 代码转换为使用 axios?

如何将此 SetLike 集合从 Scala 2.12 转换为 2.13?

有没有办法使用合并语句将此查询转换为 Oracle 查询?