我在PostgreSQL中有以下代码,需要在Amazon Redwitch上复制这些代码:

select *
from
(   select distinct
      a.id
      , sum(case when a.is_batch_empty then 1 else 0 end) 
           over (partition by a.client_id order by a.id) as empty_count
    from my_temp_table a
) a
where a.id = 111

在Amazon Redwitch中,此代码执行失败,并出现以下错误:

具有ORDER BY分句的聚合窗口函数需要框架分句

所以,在Redwitch上,我需要添加ROWS BETWEEN部分.

问题是我找不到给出与PostgreSQL相同结果的公式.

到目前为止我try 过的:

  1. 没有ORDER BY

  2. 带框架ROWS BETWEEN UNBOUNDED PRECEDING AND 101

  3. 带框架ROWS BETWEEN UNBOUNDED PRECEDING AND 101

我对这些选项中的每一个都得到了不同的结果,而且没有一个选项与PostgreSQL解决方案相匹配.

那么,我必须如何处理这个公式才能在PostgreSQL和Redwitch上获得相同的结果呢?

推荐答案

在PostgreSQL order by中,窗口规范中隐含between unbounded preceding and current row框架条款.如果删除order by,该框架将跨越整个分区.Quoting the doc:

如果是ORDER BY,则会将帧设置为从分区开始到当前行的最后ORDER BY个对等点的所有行.如果没有ORDER BY,这意味着分区的所有行都包含在窗口框架中,因为所有行都成为当前行的对等行.

在您正在寻找的内容之后提到了这一点:

默认框架选项为RANGE UNBOUNDED PRECEDING,与RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW相同.

您的第二次try 是最接近的,但请注意,默认值是RANGE,而不是ROWSI don't see RANGE in Redshift window function doc.如果a.id不是唯一的,则结果将与as demonstrated here不同.

您可以try 用相关的scalar subquery来模拟RANGE框架条款行为:

select distinct a.id,
       (select sum(case when t2.is_batch_empty then 1 else 0 end)
        from my_temp_table t2
        where a.client_id=t2.client_id
          and a.id>=t2.id)
from my_temp_table a

Postgresql相关问答推荐

PostgreSQL散列连接与嵌套循环和散列索引

通过窗口函数收集反连接结果?

PostgreSQL:重新创建主键值以匹配记录计数

在 jOOQ 中使用 $$ 引用字符串

使用正则表达式计算 SQL 查询中 WHERE 过滤器的数量

Postgres 查询计划器不会使用更便宜的复合索引

使用 postgresql Select 整数作为位和状态表

PostgreSQL:如何避免被零除?

推送到 Heroku 时出现带有 Postgres 的 Rails 迁移错误

PostgreSQL 中基于时间戳的移动平均线

如何使用 SpringBoot + JPA 存储 PostgreSQL jsonb?

LAG 函数和 GROUP BY

如何在可选参数上查询 postgres?

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

判断值是否存在于列中

如何在数据库表中查找重复条目?

使用 pg_dump 和 psql -U postgres db_name < ... 移动数据库会导致ERROR: relation "table_name" does not exist

错误:prepared statement "S_1" already exists

Entity Framework Core jsonb 列类型

pg_restore 目录错误