在Postgres中从Oracle转换rownum,在“中”;拥有;条款

在Postgres中从Oracle转换rownum,在“中”;拥有;条款,oracle,postgresql,group-by,having,rownum,Oracle,Postgresql,Group By,Having,Rownum,我需要将查询从Oracle SQL转换为Postgres select count(*) from table1 group by column1 having max(rownum) = 4 如果将“rownum”替换为“row_number()over()”,则会出现一条错误消息:“不允许使用窗口函数”。 您能帮我在Postgres中获得与Oracle相同的结果吗?下面的查询将完成Oracle查询所做的操作 select count(*) from (select column1, r

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

select count(*) from  table1 group by column1 having max(rownum) = 4
如果将“rownum”替换为“row_number()over()”,则会出现一条错误消息:“不允许使用窗口函数”。
您能帮我在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中没有多大意义。那到底是怎么回事?我测试了一张混凝土桌子。该表有6行,GROUPBY子句中的列有值:0、0、0、1、0、1。对于max(rownum)=5,返回4;对于max(rownum)=6,返回2;对于另一个值,查询不返回任何行。能否更新您的问题以包括表定义和insert语句,请?插入pac_付款模式(模式id,打开默认)值('CC',0);插入pac_付款模式(模式id,打开默认值)值('AB',0);插入pac_付款模式(模式id,打开默认值)值('ABBUONO',0);插入pac_支付模式(模式id,开放默认)值('BANK',1)插入pac_支付模式(模式id,开放默认)值('BONIF',0);插入pac_付款模式(模式id,打开默认值)值('CT',1);该表为pac_payment_modes,open_default-group by中的列,mode_id-PK请编辑您的问题以包含此信息。请提供create table语句(即,
create table pac_payment_modes(..);
),以便我们可以精确复制您的表。在第一次查询中,偏移量4和5可以,但偏移量0到3不可以(它们的值为2或4,在Oracle中,max(rownum)在1和4之间没有结果),它可以工作。谢谢现在,我将使其适应更大的查询。