Postgres视图中的临时序列

3

我有一张表格,我经常按某种方式进行排序。这个排序是派生列的基础,我们可以称之为排名。如果我查询整个表格,我可以让数据库为我计算出这个排名:

CREATE TEMP SEQUENCE the_seq;
SELECT my_table.foo, my_table.bar, nextval('the_seq') AS rank
FROM my_table
ORDER BY my_table.bar DESC;

这将产生以下有用的结果:

foo  | bar  | rank
-------------------
0005 | 2100 | 1
0003 | 1632 | 2
0002 | 1200 | 3
0001 | 899  | 4
0004 | 500  | 5

有了这个结果集,我可以确定任何“foo”的排名。但是这需要我查询整个表格并且必须遍历结果集,即使我只想要“0001”“foo”的排名。

理想情况下,我希望有一个视图来为我完成排名列,这样我就可以任意指定:

SELECT my_table_vw.foo, my_table_vw.bar, my_table_vw.rank
FROM my_table_vw
WHERE my_table_vw.foo = '0001'

并只需获取

foo  | bar  | rank
-------------------
0001 | 899  | 4

但是我不知道如何在数据库中构建它,因为视图无法在其定义中构建临时序列。我尝试做的事情是可能的吗?我觉得它必须是,因为其他选择,例如在插入时维护排名或查询整个表似乎都很荒谬。


请参见 https://dev59.com/FG865IYBdhLWcg3wKLNP - Martin Schröder
1个回答

10

不要使用序列,而是使用 row_number()

SELECT my_table.foo, my_table.bar, row_number() over (order by my_table.bar desc) as rank
FROM my_table;
您可以将此放入视图中。

太好了,那真是完美。感谢您的即时回复! - Karl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接