1

次のようなテーブルに長さ 4 のシリーズを追加するにはどうすればよいですか。

ソース表:

id
1
2
3
4
5
6
7
8

結果表:

id    series
1     1
2     2
3     3
4     4
5     1
6     2
7     3
8     4

PostgreSQL 9.1 を使用しています。

4

1 に答える 1

2

IDが本当に連続していてギャップがない場合は、を使用できますid % 4 + 1。しかし、実際にはIDはそれほど整然としていないと思います。また、IDがから生成されたものであるSEQUENCE場合は、ギャップがないことに依存するべきではありません。

row_number()ここに示すように、で適切に行うことができます: http ://sqlfiddle.com/#!12/22767/5

SELECT 
  id,
  (row_number() OVER (ORDER BY id) - 1) % 4 + 1
FROM Table1
ORDER BY 1;

generate_seriesリスト内でset-returning-functionとして使用することもできますSELECTが、これはPostgreSQLの拡張機能ですが、上記は標準のSQLであり、ウィンドウ関数をサポートしないMySQLを除く最新のデータベースで機能します。

実際にテーブルに列を追加したい場合は、もう少し複雑になります。なぜあなたがそれをしたいのか私にはよくわかりませんが、それは以下を使用して可能UPDATE ... FROMです:

BEGIN;

ALTER TABLE table1 ADD COLUMN col2 INTEGER;

WITH gen_num(id,n) AS (
    SELECT
      id,
      (row_number() OVER (ORDER BY id) - 1) % 4 + 1
    FROM Table1
    ORDER BY 1)
UPDATE table1 SET col2 = n
FROM gen_num
WHERE gen_num.id = table1.id;

COMMIT;
于 2012-12-08T03:54:58.520 に答える