Нумерация строк без функций окна

Вопрос:В Postgresql 8.2 я хочу последовательно указать строки. У меня есть таблица t в SQL Fiddle: c --- 3 2 Я хочу это: c | i ---+--- 2 | 1 3 | 2 Я пробовал это: select * from (select c from t order by c) s cross join generate_series(1, 2) i И получил: c

Вопрос:

В Postgresql 8.2 я хочу последовательно указать строки. У меня есть таблица t в SQL Fiddle:

c — 3 2

Я хочу это:

c | i —+— 2 | 1 3 | 2

Я пробовал это:

select * from (select c from t order by c) s cross join generate_series(1, 2) i

И получил:

c | i —+— 2 | 1 3 | 1 2 | 2 3 | 2 Лучший ответ:

Единственное, о чем я могу думать, это последовательность. Вы можете сделать что-то вроде этого:

drop sequence if exists row_numbers; create temporary sequence row_numbers; select next_val(‘row_numbers’), dt.c from (select c from t order by c) as dt;

Я бы выбрал drop sequence row_numbers, но temporary должен позаботиться об этом, если вы забудете.

Это немного громоздко, но вы можете обернуть его функцией, чтобы скрыть некоторые уродства.

Имейте в виду, что 8.2 больше не поддерживается, но 8.4 есть и 8.4 имеет функции окна.

Ссылки (8.2 версии):

Ответ №1

Вы можете использовать “треугольное соединение”, как показано ниже:

select a.c, (select count(*) from t where c <= a.c) as i from t as a order by i

Это предполагает, однако, что значения c уникальны, так как схема “нумерация строк” ​​- это просто количество строк, которые меньше или равно текущей строке. Это может быть расширено до включения первичного ключа или другого уникального столбца для разбиения на разделы, если это необходимо.

Кроме того, могут быть некоторые последствия для производительности с присоединением таким образом.

Оцените статью
Добавить комментарий