在 "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;
我需要将查询从 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;