在 "having" 子句中从 Postgres 中的 Oracle 转换 rownum

Convert rownum from Oracle in Postgres, in "having" clause

我需要将查询从 Oracle SQL 转换为 Postgres。

select count(*) from  table1 group by column1 having max(rownum) = 4

如果我将 "rownum" 替换为 "row_number() over()",我会收到一条错误消息:"window functions are not allowed in HAVING"。 你能帮我在 Postgres 中获得与在 Oracle 中相同的结果吗?

下面的查询将执行您的 Oracle 查询正在执行的操作。

select count(*) from 
(select column1, row_number() over () as x from table1) as t 
group by column1 having max(t.x) = 6;

不过

除非您指定 order by 子句,否则 oracle 和 postgres 都不能保证读取记录的顺序。因此 运行 多次查询将不一致,具体取决于数据库决定如何处理查询。当然,在 postgres 中,任何更新都会改变底层的行顺序。

在下面的示例中,我有一个额外的 seq 列,用于提供一致的排序。

CREATE TABLE table1 (column1 int, seq int);
insert into table1 values (0,1),(0,2),(0,3),(1,4),(0,5),(1,6);

以及强制顺序保持一致的修订查询:

select count(*) from 
(select column1, row_number() over (order by seq) as x from table1) as t 
group by column1 having max(t.x) = 6;