次のようなテーブルに長さ 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 のシリーズを追加するにはどうすればよいですか。
ソース表:
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 を使用しています。
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;