• ベストアンサー

データの持ち方

はじめまして。 データベースの知識があまりないので データの持ち方で悩んでいます。 過去のデータから、同じような値の変化を検索し、次の値を予測したいのですが どういう風にデータを持てば効率がいいのか、どういうSQLで取得したらいいのか思いつきません。 例えば、現在10→12→10→8→14という変化データの場合±1の誤差で検索し、次の値を取得したいです。 過去データに以下のようなデータがある場合、 10→12→10→8→14→15→13→11→11→9→15→18→20→19→15→14 1個目~5個目のデータの次の値の「15」と7個目~11個目のデータの次の値の「18」を取得したいです。 条件としては以下のようになります。 ・ある間隔で値を記録し、値の前後関係が取得できる ・検索は連続する値(5~10個程度)を過去データからそれに近い変化の次の値を取得したい ・データ数は100万件位 ・検索時間重視 説明下手でわかり難くて申し訳ないのですが、皆様の知恵をお貸しください。

  • MySQL
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

SQLにおいてデータ同士の前後関係というのはデータ管理上あまり 効率的にデータをもっているわけではありません。 それを考えるとデータの前後で差をとることは非効率なSQLを 書かざるを得ないでしょう。 もしやりたいのであれば、データ自体に「前のデータ」という フィールドをつくり前のデータをもつか、連番でIDフィールドを もち、1ズラしてinner join するかのどちかかになるのでは? 前者の方が時間は短縮されると思いますが 後者の方が汎用性が高く、データ管理もらくになると思います

hideki744
質問者

お礼

36万件ほどランダムなデータ登録して実験してみました。 取得できる件数が多いと帰ってこないですが 誤差を少なくすれば1秒くらいで取得できたので データが増えてきたら誤差を少なくすることで対応できそうです。 ありがとうございました。

hideki744
質問者

補足

回答ありがとうございます。 やはり、難しそうですね。 「前のデータ」を持つには連続数が5~10と不確定な状態なので 後々、15にしたい場合に変更が難しい状態になりますので できれば連番のIDの方にしたいですが inner joinを複数書く場合、100万件あっても大丈夫でしょうか? データの状態や、マシンスペックにもよるでしょうが 目標は1秒くらいで検索したいです。 遅くても10秒以内で表示させたいですね。 現実的でしょうか? ちなみにマシンスペックは CPU:Core 2 Duo E6400 メモリ:1G(場合によっては増やします) OS:Fedora Core 6 ※DB専用ではなくJavaで作ったWebサービスなども動かします

その他の回答 (1)

回答No.1

>現在10→12→10→8→14という変化データの場合±1の誤差で検索し、次の値を取得したい 「±1の誤差」とは、具体的にどういうアルゴリズムになるのか示してください。 >ある間隔で値を記録し、値の前後関係が取得できる 前後関係とは? n番目のデータを検索という意味なら、簡単に行えます。 「~関係」と言われると、何を示しているのか分からないと、具体的なアドバイスはできません。 >検索は連続する値(5~10個程度)を過去データからそれに近い変化の次の値を取得したい 「それに近い変化」とは、どういう意味でしょうか? 具体的にどういうアルゴリズムか分からなければ、アドバイスのしようがありません。 MySQLに関する質問をする場合は、使用バージョンを明記してください。~4.0、4.1、5.0~で、機能が大幅に違います。

hideki744
質問者

補足

>「±1の誤差」とは、具体的にどういうアルゴリズムになるのか示してください。 10→12→10→8→14を取得した場合 ばらばらで考えると、まず、10の±1の値を検索します (値 >= 9 and 値 <= 11) その結果の中から、次の値が12の±1の値を検索します (1回目検索で取得した値の次の値 >= 11 and 1回目検索で取得した値の次の値 <= 13) という具合に、5回~10回繰り返したような結果をできれば1回のSQLで取得したいです。 >>ある間隔で値を記録し、値の前後関係が取得できる >n番目のデータを検索という意味なら、簡単に行えます。 >「~関係」と言われると、何を示しているのか分からないと、具体的なアドバイスはできません。 n番目のデータを検索という意味です。 >「それに近い変化」とは、どういう意味でしょうか? >具体的にどういうアルゴリズムか分からなければ、アドバイスのしようがありません。 上記で書いた「±1の誤差」です。 >MySQLに関する質問をする場合は、使用バージョンを明記してください。~4.0、4.1、5.0~で、機能が大幅に違います。 現在は「5.0.27」です。 仕事でしているわけではなく、個人的に作成しているので このバージョンなら実現できるというのがあれば変更は可能です。

関連するQ&A

  • SQL文の作成

    こんにちわ。 JAVAプログラム上でデータベースを使用して データを取得したいのですが、 SQL文が複雑でわかりません。 一度データを取得して、その値を基に次に参照するカラムが変わるというものなのですが、一度にできるものでしょうか? どなたかお力添えよろしくお願いします。

    • ベストアンサー
    • Java
  • 回帰モデルの予測精度と回帰データサイズの関係を調べる方法

    手元に200個(大きさ200;行数200)の観測データがあり、その一部(n個)を用いて回帰モデルを構築した場合の予測精度が、用いたデータ数nにどのように依存するかを調べたいと考えています。 このような場合、次の(1)~(3)を、様々なnについて繰り返す方法でよいのでしょうか? (1)200個のデータをランダムに、大きさn, (200-n)の2つの部分集合に分ける (2)前者を用いて構築した回帰モデルで後者を予測する (3)予測誤差を評価する 不安な点は、nに応じて、予測されるデータ数(精度検証に用いられるデータ数)が変化してしまうことです。 何かコメントをいただければ幸いです。

  • 条件に合うデータ検索用のCGIはありませんか?

    無料で使えるデータベース検索用のCGIを探しています。 求めている条件は以下になります。 (1)項目の編集が可能 (2)規模はそこまで多くないので、MySQLサーバ不要のもの (3)データの登録はExcel(csv)によるデータの一括登録・ダウンロード式 (4)フォームによる検索(プルダウンによるカテゴリ検索、全表示) (5)テンプレート式によるデザインの変更 (6)フォームの動的(静的ファイル出力)対応 (5)までの条件を満たすものは結構あるのですが、(6)を満たすものを探すことが出来ませんでした。 検索フォームのカテゴリ検索用のブルタウンリストへ値を反映させたいのですが、 設定ファイルへのリスト登録や、管理画面から手動での選択肢登録などではなく、 登録されているデータから値を取得、リスト化したものをフォームのプルタウンリストとして 吐き出す(支援する機能でも可)ようなものはないでしょうか? 例えば、 A、B、C項目のデータにおいて、項目Aの値が「1」「2」「3」と登録されていた場合 検索フォームのA項目検索用プルタウンのリスト選択で「1」「2」「3」を選び検索したいが、 A項目に「4」「5」「6」のデータが追加された場合に検索フォームのプルタウンのリストとして「4」「5」「6」を追加する作業を省略(簡略)化したい。

    • 締切済み
    • CGI
  • MySQLでもPHPでも出来る処理はどっちでやる?

    「MySQL」「PHP」、何れでも出来るような処理はどちらでやる方が良いのでしょうか? ■例1 … 取得データを正規表現で加工して利用したい場合 ・SQL重視 … 正規表現等を駆使したSQLで、後々利用しやすい形で取得 ・PHP重視 … 普通に取得して、PHPで正規表現を利用して加工 ■例2 … データ取得がヤヤコシイ場合 ・SQL重視 … (例えそれがどんなに長くなっても)SQL文をキチンと組み立て、一度にデータ取得 ・PHP重視 … 簡単なSQL文で一旦データ取得後、PHPのループ文内等処理で、再度DBアクセスしデータ取得 ・ちょっと例えが微妙かもしれないのですが、そもそもデータ取得する際、どのように考えるのが正しいのでしょうか? 1.なるべく利用予定に近い形でデータを取得 2.後で色々加工するかもしれないので、取得時点ではあまり加工せず、そのまま取得 ※要は、頻繁にDBへアクセスしてデータ取得するより、「DBへアクセスするのは極力避け、取得したデータはなるべく使い回す」方が良いのでしょうか? ・それとも、ここら辺はケースbyケースなので、一概には言えないのでしょうか? ・あるいは、別にどっちでもいい? あまり、気にしなくても良い?

    • ベストアンサー
    • MySQL
  • SQL、特にOralce 8iに関して、データの集計に関する質問です。

    SQL、特にOralce 8iに関して、データの集計に関する質問です。 以下のようなデータがあったとします。 [開始年月(int)]  [終了年月(int)]  [値] 201001      201004      1 201003      201007      2 201005      201010      3 201007      201101      4 このとき以下のような感じで、重複している月で値を合算し、一番値が大きな月を求めるには、どうすればよいでしょうか。 1 2 3 4 5 6 7 8 9 101112 (月) ■■■■________ __■■■■■_____ ____■■■■■■__ ______■■■■■■ ↓↓↓↓↓↓↓↓↓↓↓↓ 1 1 3 3 5 5 9 7 7 7 4 4 (計) ←この場合 7月が一番大きかった できればPL/SQLなしで解決したいと思っております。 ご教示お願いいたします。

  • SQLserver2005より、SQLにて各データベースのプロパティに

    SQLserver2005より、SQLにて各データベースのプロパティにあるサイズと使用可能領域の値を取得したいのですが、そのようなSQLはありますでしょうか。

  • SQL (insert文)文の質問です。

    すみません、緊急で調べる時間があまりなくてお尋ねします。 次のDBが2つあります。 データベース名:A_DATA 内容  名前     番号     登録年月日 これには既にデータが投入されています。 そして データベース名:B_DATA 内容  名前     番号     住所     電話     国籍 とあった場合B_DATAにinsertを行うのですが、 その際のデータの内容はA_DATAの内容を検索してその 値を投入したいのです。 A_DATAの検索条件は登録年月日が本日のもので B_DATAの名前と番号の値は 名前=A_DATAの名前 番号=A_DATAの番号 でINSERTしたいのです。 意味がわかりますでしょうか? 多量にデータがあるのでなんとかうまいSQLを考えてるのですが、あまり詳しくないもので。。。 すみません誰かよろしくお願いします。

  • 「なでしこ」でのAccessデータのエクスポート(Export)方法

    日本語プログラム言語「なでしこ」で、Access テーブルをSQLで 検索して、Excelにエクスポートしたいと考えています。 SQLで検索して表示までは以下のコードで出来るのですが、 Excelにエクスポートする方法が分かりません。 ご教授下さい。 よろしくお願い致します。 -----1-----2-----3-----4-----5-----6-- # (1)データベースを開く 母艦パス&「test.mdb」をACCESS開く。 # (2)「従業員M」テーブルで「名前%」を含むものを検索 「SELECT * FROM list WHERE list_name LIKE "名前%"」をSQL実行 # (3)検索結果を全部一度に取得 DB結果全部取得して表示 # (4)閉じる DB閉じる。 -----1-----2-----3-----4-----5-----6--

  • 条件のある検索方法

    たびたびお世話になります。 PL/SQLで以下のような検索をしたいのですが、 1つのSQLで実現するにはどのようなSQL文を 書けばいいですか?初心者ですが、よろしくお願いします。 ちなみに、Indexはありません。TABLE_AとTABLE_Bの列は同じです。 ・COL1='plan'、COL2='hokan'でTABLE_Aを検索し、  (1)データがあればTABLE_AのCOL3,COL4をTABLE_Bの   COL3,COL4と結合してTABLE_BのCOL0の値を取得  (2)データがなければCOL1='plan'、COL2='hokan'で  直接TABLE_Bを検索しCOL0の値を取得 よろしくご教示ください。

  • Webアプリでのデータ保存方法は?

    お世話になります。 HTMLを使ってWEBアプリの開発をしている初心者なのですが、 アプリ内でデータの保存や検索(データベースの様に)をする場合 どういった方法があるのでしょうか? localstorageだとアプリを終了してもデータが残るのでいい反面 ただデータベースの様に保存ができないのが検索の時に困るので、 Web SQL Database(SQLite?)を使おうかと思っているのですが、 調べるとゆくゆくは使えなくなる?W3Cでは推奨されていない?ということみたいなのですが、 通常のスマホアプリでは、みんなどうやってデータを保存しているんでしょうか?