我有一个表,我经常以某种方式订购。这种排序是派生列的基础,我们可以称之为秩。如果我查询整个表,我可以让数据库为我计算排名:
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的排名。然而,这需要我查询整个表并遍历结果集,即使我只想要foo的秩"0001"。
理想情况下,我会有一个为我做排名栏的视图,所以我可以任意地说:
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
然而,我不知道如何在数据库中构造它,因为视图不能在其定义中构造临时序列。我想做的事情有可能吗?我觉得这是因为其他选择,在插入时保持排名或查询整个表似乎很可笑。
不要使用序列,而是使用row_number()
:
SELECT my_table.foo, my_table.bar, row_number() over (order by my_table.bar desc) as rank
FROM my_table;
你可以把这个放到视图中。