И опять про нумерацию строк

ZayatsZ
Дата: 10.12.2014 13:15:42
Есть таблица:
CREATE TABLE categories (
    category_id integer NOT NULL,
    parent_id integer DEFAULT 0,
    title character varying(200),
    position integer DEFAULT 0
);

Используется для организации иерархии неких категорий, без ограничения уровня вложенности. Недавно было добавлено поле position для возможности произвольного порядка вывода подкатегорий, оно уникально в рамках одного parent_id. То есть используется запрос:
SELECT * FROM categories WHERE parent_id=... ORDER BY position

К моменту добавления этого поля в таблице уже было прилично так записей, так что ручное первоначальное прописывание значений position - не вариант.

Нужно как-то автоматически заполнить это поле возрастающими от 1 значениями внутри из каждой подкатегории. То есть, например, при выполнении запроса
SELECT *, row_number() over() as rn FROM categories WHERE parent_id=... ORDER BY category_id

выводится последовательность в поле rn.

Так вот можно написать какой-нибудь хитрый UPDATE, чтобы первоначально эту самую последовательность записать в поле position?
/\/\/\/\/\/\
Дата: 10.12.2014 15:35:48
ZayatsZ,
WITH
tt00 AS (
SELECT
  bb.zz AS category_id,
  CAST(RANDOM() * 10 + 1 AS INTEGER) parent_id
FROM generate_series(1, 100) bb(zz)
),

tt01 AS (
SELECT
  category_id,
  parent_id,
  row_number() OVER(partition BY parent_id ORDER BY category_id) AS f1
FROM tt00
)

UPDATE categories t1 SET 
  position = tt01.f1
FROM tt01
WHERE tt01.category_id = t1.category_id;