[英]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 BY
與PARTITION 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.