PostgreSQL: создать серию чисел, уникальных для ссылки

Yorma спросил: 28 апреля 2018 в 08:51 в: sql

Я сделал пример: http://sqlfiddle.com/#! 17 / 0f948 / 9

1-для многих это то, что я строю, хотя многие-ко-многим будут больше реальная жизнь для этого примера.

Что мне нужно сделать: я должен иметь возможность генерировать авторский порядок, изображающий последовательность целых чисел для столбца authororder-столбца в авторской таблице, начиная с номера 1, так что каждое число уникальный среди справочника. Таким образом, для каждого автора, установленного под определенной книжной ссылкой, цифры от 1 до 2, до 3 и т. Д. Кроме того, номера для authororder должны быть сгенерированы для отражения порядка author.fullname (as: 'select from author order by fullname ').

Я попытался использовать последовательность, но не сбрасывает порядковый номер для каждой книги, как мне бы хотелось, вместо этого число продолжает увеличиваться (как я полагаю). Я также попытался сделать это с помощью row_number (), но не смог подготовить скрипт, который достиг бы того, что я хочу.

Конечный результат после создания authororder был бы примерно таким:

author_id       fullname          mobileno            fk_book_id           authororder
100           John Green            30303                 1                     (1)
101           Maureen Johnson       4343                  1                     (3)
102           Lauren Myracle        76665                 1                     (2)
103           Greg Mortenson        6434                  2                     (2)
104           David Oliver Relin    72322                 2                     (1)
105           Marco Polo            54321                 3                     (3)
106           Angus MacGyver        27234                 3                     (1)
107           Timo TA               83451                 3                     (4)
108           Anonymous             55554                 3                     (2)

1 ответ

Gordon Linoff ответил: 28 апреля 2018 в 10:35

Кажется, вы хотите:

row_number() over (partition by fk_book_id order by fullname) as authororder

Вы можете включить это в обновление как:

update author a
    set authororder = new_authororder
    from (select a.*, 
                 row_number() over (partition by fk_book_id order by fullname) as new_authororder
          from author a
         ) aa
    where a.authorid = aa.authorid;
Yorma ответил: 28 апреля 2018 в 10:06
Отлично, спасибо! И как обновить фактические значения authororder с результатами вашего фрагмента?