我试图理解为什么DB2做了我所期望的事情,而Postgres却没有。
我已经成功地复制了我在这个相当简单的自包含查询中看到的行为。
with mytables(id,animal) as (
values (1,'Cat'),(2,'Dog'),(3,'Mouse')
)
select *,
case
when animal = 'Dog' then 0
when animal = 'Cat' then 1
else 2
end my_order_by,
row_number() over() as rank
from mytables
order by my_order_by ;
DB2将返回我期望看到的结果:
ID Animal MY_ORDER_BY RANK
2 Dog 0 1
1 Cat 1 2
3 Mouse 2 3
波斯特格雷斯返回:
ID Animal MY_ORDER_BY RANK
2 Dog 0 2
1 Cat 1 1
3 Mouse 2 3
在我看来,Postgres是基于ID而不是order by
应该强制执行的row_number。有没有办法解决这个问题,使Postgres能够执行这里所期望的操作?
使用谷歌CloudSQL和DB2 v11上的PostgreSQL 13,顺便说一下。
3条答案
按热度按时间soat7uwm1#
将顺序添加到row_number,以获得所需的排序。
第一个
xxe27gdn2#
正如所指出的,ROW_NUMBER()排序由它自己的ORDER BY子句
ROW_NUMBER() OVER(ORDER BY ... [PARTITION BY ...])
控制一个比nbk的答案更简洁的处理方法是
omjgkv6w3#
这是编写与Charles和nbk相同的查询的另一种方法,其中case作为横向子查询
db<>fiddle