3

Postgresql 8.2では、行に順番に番号を付けたいと思います。私はSQLフィドルにテーブルを持っていtます:

    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
4

2 に答える 2

3

私が考えることができる唯一のものは、シーケンスです。次のようなことができます。

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 バージョン):

于 2012-10-26T19:27:26.683 に答える
2

次のように「三角結合」を使用できます。

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

cただし、 「行の番号付け」スキームは現在の行以下の行のカウントに過ぎないため、これは の値が一意であることを前提としています。これは、必要に応じて、タイブレーク用の主キーまたはその他の一意の列を含めるように拡張できます。

また、この方法で参加すると、パフォーマンスに影響が出る可能性があります。

于 2012-10-26T20:26:23.570 に答える