将特定于Oracle的sql迁移到postgresql

将特定于Oracle的sql迁移到postgresql,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,甲骨文: 博士后: 问题:postgresql中没有Rownum,如果我们使用row\u number()over()而不是Rownum,将引发PSQLException select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY EQUIP_UNIT_INIT_CODE, ROWNUM) from CAR_SEARCH_GTT; 问题:如何将上述查询转换为PostgreSQL?如果您不希望在打领带时重复编号,则使用非确定性

甲骨文:

博士后:

问题:postgresql中没有Rownum,如果我们使用
row\u number()over()
而不是
Rownum
,将引发PSQLException

select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY EQUIP_UNIT_INIT_CODE, ROWNUM)  from CAR_SEARCH_GTT;

问题:如何将上述查询转换为PostgreSQL?

如果您不希望在打领带时重复编号,则使用非确定性的
ROWNUM
是有意义的

也就是说,正如没有名字的@a_horse_所说的那样,
ORDER BY
PARTITION BY
相同的列毫无意义

请试试这个:

ERROR: window functions are not allowed in window definitions
如果
CAR\u SEARCH\GTT
上有一个PK作为
id
,那么您可以执行以下操作:

with numbered as (
  select *, row_number() over () as rnum
    from CAR_SEARCH_GTT
)
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE 
                         ORDER BY EQUIP_UNIT_INIT_CODE, rnum)  
  from CAR_SEARCH_GTT;

如果您不希望在平局中重复编号,则使用非确定性的
ROWNUM
是有意义的

也就是说,正如没有名字的@a_horse_所说的那样,
ORDER BY
PARTITION BY
相同的列毫无意义

请试试这个:

ERROR: window functions are not allowed in window definitions
如果
CAR\u SEARCH\GTT
上有一个PK作为
id
,那么您可以执行以下操作:

with numbered as (
  select *, row_number() over () as rnum
    from CAR_SEARCH_GTT
)
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE 
                         ORDER BY EQUIP_UNIT_INIT_CODE, rnum)  
  from CAR_SEARCH_GTT;
SQL表表示无序集。如果没有显式排序,行的顺序是任意的。如果排序键不是唯一的,则关系的顺序是任意的

然后,对于窗口函数,您不需要重复
ORDER BY
中的
PARTITION BY
键。您可以在Oracle中编写所需内容:

select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE 
                         ORDER BY EQUIP_UNIT_INIT_CODE, id)  
  from CAR_SEARCH_GTT;
尽管有
rownum
,但排序是任意的。Oracle不保证每个组内的订单

rownum
的一个效果是在每一行上有一个不同的值。因此,没有联系。使用
行号()可以更清楚地表达这一点。

Oracle需要一个ORDER BY子句,所以任何东西都可以到达那里

在Postgres中,您可以通过删除
ORDER by
来执行相同的操作——Postgres扩展了
行数的语法。因此,等价物是:

select ROW_NUMBER() OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY ROWNUM) 
from CAR_SEARCH_GTT;
在这两种情况下,您可能都有一个适当的键用于排序——可能是标识列或创建日期。

SQL表表示无序集。如果没有显式排序,行的顺序是任意的。如果排序键不是唯一的,则关系的顺序是任意的

然后,对于窗口函数,您不需要重复
ORDER BY
中的
PARTITION BY
键。您可以在Oracle中编写所需内容:

select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE 
                         ORDER BY EQUIP_UNIT_INIT_CODE, id)  
  from CAR_SEARCH_GTT;
尽管有
rownum
,但排序是任意的。Oracle不保证每个组内的订单

rownum
的一个效果是在每一行上有一个不同的值。因此,没有联系。使用
行号()可以更清楚地表达这一点。

Oracle需要一个
ORDER BY子句,所以任何东西都可以到达那里

在Postgres中,您可以通过删除
ORDER by
来执行相同的操作——Postgres扩展了
行数的语法。因此,等价物是:

select ROW_NUMBER() OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY ROWNUM) 
from CAR_SEARCH_GTT;

在这两种情况下,您可能都有一个适当的键用于排序--可能是标识列或创建日期。

总体
选择
上的
order by
是什么?我问这个问题的原因是因为Oracle根据
订单生成
rownum
@a\u horse\u,名称为\u no\u谢谢您的回复,我已经更新了查询。很抱歉,这是我的错。@MikeOrganek是的,但Postgresql不支持按分区和按顺序排列。我删除了我的答案,因为我同意没有名字的@a_horse_。这个查询没有多大意义。您的分区似乎是以一种不确定的方式完成的。并且在移植时很可能会有不同的行为。在整个
select
上的
order by
是什么?我问这个问题的原因是因为Oracle根据
订单生成
rownum
@a\u horse\u,名称为\u no\u谢谢您的回复,我已经更新了查询。很抱歉,这是我的错。@MikeOrganek是的,但Postgresql不支持按分区和按顺序排列。我删除了我的答案,因为我同意没有名字的@a_horse_。这个查询没有多大意义。您的分区似乎是以一种不确定的方式完成的。并且在移植时很可能会有不同的行为。