簡體   English   中英

將 Oracle 特定 sql 遷移到 postgresql

[英]Migrating Oracle specific sql to postgresql

Oracle:

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

Postgres: ?

問題:postgresql 中沒有 Rownum,如果我們使用row_number() over ()而不是ROWNUM ,則會拋出 PSQLException。

ERROR: window functions are not allowed in window definitions

問題:如何將上面的查詢轉換為 PostgreSQL?

如果您不希望RANK()數字在平局的情況下重復,則使用不確定的ROWNUM是有意義的。

也就是說,正如@a_horse_with_no_name 所說, ORDER BYPARTITION BY相同的列毫無意義。

請試試這個:

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;

如果CAR_SEARCH_GTT上有一個 PK 作為id ,那么您可以執行以下操作:

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

SQL 表表示無序集。 如果沒有顯式排序,行將按任意順序排列。 如果排序鍵不是唯一的,則關系的順序是任意的。

然后,您不需要在 window 函數的ORDER BY中重復PARTITION BY鍵。 您可以在 Oracle 中編寫您想要的內容:

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

盡管有rownum ,但順序是任意的。 Oracle 不保證每組內的訂貨。

rownum的一個作用是在每一行上具有不同的值。 因此,沒有任何聯系。 使用ROW_NUMBER()可以更清楚地表達這一點:

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

Oracle 需要一個ORDER BY子句,所以 go 那里的任何東西都可以。

在 Postgres 中,您可以通過刪除ORDER BY來做同樣的事情——Postgres 擴展了ROW_NUMBER的語法。 所以等價的是:

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

在這兩種情況下,您可能都有一個合適的排序鍵——可能是一個標識列或創建日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM