基于另一列对列进行排序(PostgreSQL)

gwo2fgha  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(99)

我有一个spring-boot-data-jpa应用程序,其中包含这样的PostgreSQL表:
| 对象标识|文件名| document_name |
| --|--| ------------ |
| 一个|file1_for_obj_1| file1_for_obj_1 |
| 二个|file1_for_obj_2| file1_for_obj_2 |
| 一个|file2_for_obj_1| file2_for_obj_1 |
| 一个|file3_for_obj_1| file3_for_obj_1 |
| 二个|file2_for_obj_2| file2_for_obj_2 |
我需要添加一列number,这将是序列号,并将考虑object_id列的值。也就是说,这个想法是与一个或另一个object_id相关的行的编号。
因此,该表应如下所示:
| 对象标识|文件名|数字,号码| number |
| --|--|--| ------------ |
| 一个|file1_for_obj_1|一个| 1 |
| 二个|file1_for_obj_2|一个| 1 |
| 一个|file2_for_obj_1|二个| 2 |
| 一个|file3_for_obj_1|三个| 3 |
| 二个|file2_for_obj_2|二个| 2 |
我的第一个想法是创建一个可以生成新值的序列。例如,像这样:

CREATE SEQUENCE _document_sequence
    MINVALUE 1
    START WITH 1000
    INCREMENT BY 1

字符串
但在这种情况下,它不会考虑object_id列的值。也就是说,可能应该用java代码生成。此外,我需要进行一次迁移,将新列number的值放入现有行。但我不知道如何最有效地做到这一点。

eit6fx6z

eit6fx6z1#

你不能有效地或有效率地做你想做的事情。您需要为 * 每个对象id* 创建一个序列(10K id然后10K序列),序列中会有间隙。或者,您可以使用MAX()+1方法,但这实际上保证了最终的副本。最简单的方法是创建一个view并在其中生成number。(参见Demo

create view <view name> as
       select t.*
            , row_number() over(partition by object_id  
                                    order by document_name
                                ) as number
         from <table name> t;

字符串

相关问题