データベースで列の項目数が1,000列を超える場合
Oracleデータベースで列の項目数が1,000列を超える場合、一般的にはどうすればよいのですか?
ある電子機器のテスト結果をデータベースに記録しようとしています。
一つのロットには、測定する端子が2,000個あります。
その各端子を1ミリ秒毎に5秒間測定しているので、1端子につき5,000個のデータが取れます。
ですから、端子数2,000個×測定データ数5,000個=1,000万個のデータが一つのロットから取れることになります。
表計算ソフトで愚直に表を作れば、以下のようになります:
ロット名, 端子名, データ_0ms, データ_1ms, データ_2ms, ・・・, データ_4999ms
Lot_A, Terminal_0001, 0.0, 0, 11, 0,23, ..., 4.98
Lot_A, Terminal_0002, 0.4, 0, 33, 0,43, ..., 5.07
Lot_A, Terminal_0003, 0.2, 0, 28, 0,36, ..., 5.02
:
Lot_A, Terminal_2000, 0.8, 0, 16, 0,32, ..., 4.95
ただ、これをOracleデータベースに移そうとしたら、1,000列以上は作れないとエラーが出ました:
ORA-01792 2
表またはビューに指定できる最大列数は1000 です。
原因: 1001 列以上ある表またはビューを作成しようとしたか、列を追加しすぎたため許容できる最大の列数1000 を超えました。表にある未使用の列も最大列数1000 に含まれることに注意してください。
対処法を検索すると、「列数が1,000個を超えるなんて設計がおかしい」「正規化してないのが悪い」など説教ばかりで、具体的な対処法が書かれたものが見つかりません。
私としては、5秒間(5,000個)のサンプリングでは足りなくて、本当は20秒間(20,000個)ぐらい欲しい気持ちです。
一つ考えたのが、以下のように、列でデータを持つのではなく、行で持つようにして、端子毎にテーブルを作ることです:
端子1テーブル
ロット名, 端子名, データ
Lot_A, Terminal_0001, 0.00
Lot_A, Terminal_0001, 0.11
Lot_A, Terminal_0001, 0.23
:
Lot_A, Terminal_0001, 4.98
端子2テーブル
ロット名, 端子名, データ
Lot_A, Terminal_0002, 0.02
Lot_A, Terminal_0002, 0.40
Lot_A, Terminal_0002, 0.33
:
Lot_A, Terminal_0002, 5.07
しかし、これでは各ロット毎に端子テーブルが2,000個必要になります。
端子同士の比較となると、2,000個のJOINが必要になりますよね。
これが一般的な対処法なのでしょうか?
ということで、「私ならこうする」といった、具体的な対処法を教えて下さい。
Oracle以外のデータベースの例でも構いません。
補足
質問がわかりにくかったようで、すみません。 (1)ご指摘の様に関数で出来ないのは承知しています (2)>何に困っているのか、質問上はっきりしません この売上データは全ての元データでして、これを加工修正して必要な資料を作成します。定期形式の資料はマクロを組み込んで必要なデータを取り出せる様にしているのですが、困っているのは乱発的に依頼される資料なのです。形式も定時制もなく、依頼の度に手で必要データを取り出して集計していたのですが、月に違う形式で何件も入ってくると、データ量が膨大な事もありかなりの時間が費やされてしまい、他の業務に支障をきたしてしまいます (3)>マクロを組んでも、毎回指定した列を変更しなければならずが具体的に判りません 例えば、「A列、B列、C列の順に並び替える」或いは 「A列、B列、C列を削除」という特定のセルをマクロで指定しまうと、異なる列の並び替えや削除には指定したセルを変更しないと起動しません。故に、例えばA列1行目等に条件入力出来るようにして、A1のセルに「C」と入力すれば、C列を削除したり、C列を基準に並び替えたりするようなマクロ等はないかと思ったのです。抽出では、1行目に同じ列項目を作成し、2行目に仮にE列にその中で検出したい項目を入れれば、その条件と同じデータを取り出せるマクロが作成できたので、同じような事は可能なのでは、と思った次第です