• ベストアンサー

Accessでデータを「間引き」するには?

Microsoftアクセスを使って電力使用量を管理するシステムを製作しています。 集計する基となっているデータは (1)CSVで出力されたファイル (2)縦に時間が30秒刻みで入力(0:00:00~23:59:30) (3)横にそれぞれの計測機器での計測値が入力 (4)1日1ファイルが生成され、日時を含んだファイル名で保存される 上の様なデータをアクセス上で管理&集計してグラフ化などを行いたいと考えています。 現状で機器が約100個あるので100列、30秒刻みで24時間なので2880行、1日で約300,000ものレコードが生成されています。 データの計測と出力はとあるメーカーの機器で行っているため、容易に仕様を変更することは出来ません。 このままだと長期使用を考えた際にデータ量が大きくなってしまうので、業務上必要なレベルまで集計して、外部ファイルとして保存し必要な際に取り込むという手法を検討中です。 具体的には、現在の30秒間隔でのデータを1分または2分間隔まで間引きしたいと考えています。 このデータを1ヶ月単位でまとめ外部ファイルに出力し、必要な際に取り込ませます。 それぞれのデータは30秒間隔の差分なので、1分または2分にまとめるには2行または4行分のレコードの和算をしなければなりません。 1日単位で出力されたデータを1ヶ月単位でまとめるのは単純に追加クエリを使って可能ですが、上記の様な集計は可能なのでしょうか? 1分間隔ならば、「時間」フィールドの「分」の桁まで一致するレコードをグループ化という方法もあるかと考えましたが「時」の桁が 1桁の場合(0時~9時まで)と2桁の場合(10時以降)があるので、上から○桁目まで一致するものをグループ化して合計を出すという方法も使えません。 (そもそもそんなグループ化の手段があるかどうか知りませんが...) 何かよい方法はありますでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.4

おやりになりたいことは2分単位に丸めるという計算ですね 丸めの一般式は Int(数字/基数)*基数 です この式で基数を2分にしてやればいいいのです Int([時間]/#0:02:00#+0.00000001)*#0:02:00# ただし、これでは >一部5レコードと3レコードになってしまう部分がありますね。 こういう現象が出ます これは日付時刻型というのが浮動小数点型の数値であることから生じる現象です 小数点型の数値はすぐに無限小数になってしまいますが コンピュータではこれを有限のデータ型で扱う必要から丸めることになり そのときに生じるわずかな誤差がInt関数を使用することにより大きく現れてしまうのです これに対処すには丸めで生じるわずかな誤差分を補正してやります Int([時間]/#0:02:00#+0.00000001)*#0:02:00#

xtoufux
質問者

お礼

ご返答ありがとうございます。 なるほど、一般的にはのようにして丸めるのですね。 他にも応用出来ますね!とても参考になりました。 実際にこの方法を使ってみたいと思います。 小数値の誤差発生に関しては聞いたことがありました。

その他の回答 (4)

noname#182251
noname#182251
回答No.5

#2、#3です。 Int(CCur(Nz([時刻]*24*30,0))) Nzを使用して良いのですか?Nullが0でくくられては困るように感じるのですが。実際の仕様が判らないので何とも云えませんが。 それと誤差丸めにCCurを使用するのは(好みの問題ですが)私ならば使いません。#2、#4に提示されたような方法が、何が起きているか明快なので、問題が発生したときデバッグが楽です。

xtoufux
質問者

お礼

丸めて算出する部分は時刻を表すフィールドのみなのでNullが入ることはありません。そうなるとこれでも問題は無い様ですね。 ですがご指摘からするとCCurは後のことを考えると使わない方が良いみたいですね。 +0.00000001の様にアナログ的に対処するよりも関数で対処した方が良いものかとずっと思っていましたが単純にそうではないという事を認識しました。 大変ありがとうございました。

noname#182251
noname#182251
回答No.3

#2です >このクエリでは時刻フィールドをどのような数字と捉えて演算をしているのでしょうか クエリというかアクセス(そして多くのDBや言語)の日付時刻型の実体は、倍精度ぐらいの数字です。整数部が日付、小数部が時分秒以下を表現します。で Int([時刻]*24*30) のような発想が出ます。しかし少数で「分」を正確に表現できないため、 >一部5レコードと3レコード が発生するようですね。Int([時刻]*24*30+0.1) みたいな対策では如何でしょうか?

xtoufux
質問者

補足

ご返答ありがとうございます。 なるほど、日付以下を小数としていたんですね。 Int関数による小数値の誤差発生に関しては聞いたことがありました。 現在ご教授頂いた方法を参考に以下のような形で対処したのですがこれは問題は無いでしょうか? ちなみに結果は正しく表示されております。 V: Int(CCur(Nz([時刻]*24*30,0)))

noname#182251
noname#182251
回答No.2

時間フィールドは「日付時刻型」でしょうか?そうでなければフィールドを追加し型を変換してください。SQL文は UPDATE 時刻 SET 時刻.時刻 = [時刻文字]; みたいなので。で、日付時刻型であれば Int([時刻]*24*30) AS T のごとくすれば2分間隔で表示できます。下記のようなSQL文で確認しました。 SELECT 時刻.時刻文字, Int([時刻]*24*30) AS T FROM 時刻;

xtoufux
質問者

補足

ありがとうございます。 時間フィールドは日付時刻型になっております。 実際に試してみました。 たしかに4レコード毎に同じ数字が振られるようになりましたが、一部5レコードと3レコードになってしまう部分がありますね。 Int関数の影響でしょうか。 このクエリでは時刻フィールドをどのような数字と捉えて演算をしているのでしょうか?

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

方法はあります 具体的なやり方を提示するには時間フィールドがどうなっているかの 詳しい情報が必要ですね >0:00:00~23:59:30 こういう文字列が入っているのですか あるいは 0:00:00 23:59:30 のような文字列?

xtoufux
質問者

補足

ありがとうございます。 時間フィールドは日付時刻型になっており、後者の[0:00:00]の様な文字列が挿入されています。 この様なレコードが2880件存在する形になります。

関連するQ&A

  • アクセスで大量のデータを扱う際の注意は?

    アクセスである機器での計測データの管理、集計などの作業を行いたいと考えています。 計測データのレコード数が多いので、それらを効率良く管理するためのノウハウを知りたいと思い質問させて頂きました。 実際にレコード数がどの程度かというと、計測間隔が30秒に1回、計測機器が最大90点まで接続可能であることから、 一日最大259,200レコード、さらに時間と機器名称のデータが各レコードに追加されます。(各計測値は小数点以下第2位までの小数) これを1年積み重ねると94,608,000レコードという膨大な数量になってしまいます。 さらにこれを何年、というかたちで積み重ねてゆくことを考えて、これらの大量のデータを効率よく管理、または集計に利用するために 必要な知識、テーブルの作り方やファイル管理の方法などをご教授頂けたらと思います。 拙い知識の中で私が現在検討している内容としては、 (1)1年半前までのデータはテーブルに残しておきたい (直近データの処理レスポンスを重視したい/前年同月での比較等を行いたいため) (2)1年半以上前のデータはどこか別の所へバックアップし、必要な時に読み込んでくる様にしたい (1年半以上前のデータは集計に利用する頻度が稀であるため) (3)アクセスで行う集計はごく簡単なもの (ある期間を指定したらそのデータを抽出し、グループ毎に和算をして、それをグラフ化する。 一度の集計で利用するのは、最大でも全体の中の1,000レコード程。多くの場合は120レコード程しか使用しない) (4)基本的にアクセスで行う集計にはレスポンスの速さが要求される。(特に直近データ) 基本的にデータは大量なのですが処理自体はとても簡単なものなのです。 大量のデータを保存している影響を処理スピードに与えないようなシステムを作るにはどんな所に注意をしたらよろしいのでしょうか? よろしくお願いいたします。

  • 大量データ(csv)ファイルのインサート

    1分に1回レコードが出力されたログファイルがあります。 これはCSV形式のファイルです。ファイルは15ファイルあります。 各ファイルの列数は違っていて60~260まであります。 必要なデータが記録されている列もファイルによって違いますが 各ファイルともいらない列が半分くらいありデータは無いか"-"になっています。 データは大体整数4桁小数2桁の数値です。 毎月一回集計しないといけないので各ファイルに対応したテーブルを作り データを読み込みたいと思います。 過去分を持つとレコード数が増えるので毎回読み込みからにしたいと思います。 データをテーブルに取り込むやり方を考えています。 VBでシステムを作っているのでファイルを1行ずつ読み 必要なデータをインサートするのがいいのか SQLServerの機能を使って全部読み込むのがいいのか 何を調べて判断すればいいのかアドバイスをお願いします。 VBは2008でSQLServerも2008でやろうかと考えています。

  • VBAのデータ抽出(間引き)について

    VBAのデータ抽出(間引き)について 当方VBA初心者なのですが、 VBA(EXCEL2007)を使用してグラフ作成をしようと思っています。 元データの書式は以下の通りでデータ行は30秒間隔で 一カ月分(8万行)あります。 2010/08/01 01:00:34     1112.83 2010/08/01 01:01:04     1110.43 2010/08/01 01:01:34     1111.87 2010/08/01 01:02:04     1112.23 2010/08/01 01:02:34     1112.43 2010/08/01 01:03:04     1112.03 2010/08/01 01:03:34     1110.83 2010/08/01 01:04:04     1112.43 2010/08/01 01:04:34     1110.63 ・・・ データ量が多すぎるので間引きしようと思っています。 間引き(抽出)条件は以下の様に考えています。 10行毎(5分毎)に値の最大値の行を抽出して別シートへコピー。 VBAマクロで処理するにはどの様な コードで実現可能でしょうか? 教えて頂きたく。よろしくお願いします。

  • データ抽出について

    Excelに1秒間隔に取得したデータが1万行以上あります。 この1秒間隔のデータを1分間隔で間引きしたデータに変換したいと 思っているのですが、容易に間引く方法を教えてください。 60行間隔で手動削除するには行数が多くて困っております。

  • アクセスのデータ集計方法(名寄せ)がわかりません。

    アクセスのデータ集計方法に関する質問で、あるソフトの構造がどうしてもわからなくて質問させて頂きました。 1)ソフトの概要 ソフトはアクセスとエクセルで構成されていて、プログラムはVBAをしようしています。「元データ」(以下に詳細説明)をソフトに読み込んでアクセスで集計し、エクセルでグラフを出力する分析用ソフトです。エクセルのグラフは元々作ってあり、アクセスでデータを集計したものをエクセルのセルにリンクする形式のようです。 2)元データとは 元データとは、Aさん~Eさんがある時点でE・F・Gの3つのお店で商品を購入した際の履歴データで、人物ごとに年齢・品目・金額等のデータが1行で表示されています。従って、AさんがE店・F店で商品を購入している場合は、データが2行で表示されています。分析するには、2行データを1行データにするために「名寄せ」をする必要があります。 3)質問 (1)複数レコードを1つのレコードに集計する(名寄せ)にはどうすればよいのか。 (2)品目と金額から、品目ごとの平均金額を出したい場合など、あるデータとあるデータを選んできて集計させるのは、「クエリ」という機能を使うのでしょうか。 (3)上記との関連ですが、例えば国がホームページ上で公開している複数の既存統計をソフトに読み込んで必要データだけを取り出して集計し、エクセルで作ってあるグラフにデータをリンクさせてグラフを出すようなソフトを作ることは可能なのでしょうか。 情報処理が専門ではないので、わかりにくくて申し訳ないです。 大変困っております、よろしくお願いします。

  • CSVデータを取得・編集しTXTに保存する方法

    Excel2016のVBAで、ある時系列のCSVファイルのデータを取得・編集し、テキストファイルに保存する方法についてなんですが、やりたいことの順序としては次の通りです。 ■1. CSVファイルの保存先が特定されていないため、ダイアログで開くファイルを指定します。ただ、開く際、1ヶ月の短い期間であってもExcelの最大行数1,048,576行を軽く超えてしまうため、テキストファイルで開きます。 ■2. 開かれたファイルのデータを取得・編集します。 テキストファイルで開いたデータは、1行目から順に次のようになっています。 1行目は文字列 2003.05.04 21:00:00.626,118.99,118.94,20.8,0.6 2003.05.04 21:00:00.989,118.969,118.949,44.4,54.3 2003.05.04 21:00:01.408,118.958,118.948,28.7,0.8 2003.05.04 21:00:01.741,118.957,118.942,0.5,15.7 2003.05.04 21:00:22.638,118.953,118.943,0.5,37.7 2003.05.04 21:00:25.348,118.96,118.94,60.5,35.7 2003.05.04 21:00:26.087,118.956,118.946,8,13.6 2003.05.04 21:00:27.984,118.956,118.952,23.9,8.4 2003.05.04 21:00:49.884,118.968,118.948,3.2,47.1 2003.05.04 21:00:55.855,118.972,118.952,52.7,39.1 2003.05.04 21:01:05.362,118.971,118.961,21.5,4 2003.05.04 21:01:21.012,118.983,118.958,0.6,38.3 2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1 2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1 2003.05.04 21:01:52.171,118.987,118.967,47.1,39.1 2003.05.04 21:02:05.014,118.982,118.972,0.8,8.5 2003.05.04 21:02:06.232,118.985,118.965,0.9,30.9 2003.05.04 21:02:15.026,118.983,118.963,7.6,40.5 2003.05.04 21:02:19.716,118.979,118.959,11.7,32 2003.05.04 21:02:31.766,118.971,118.961,0.6,53.5 2003.05.04 21:02:49.565,118.975,118.955,8,54.3 2003.05.04 21:03:01.095,118.973,118.953,12,74 2003.05.04 21:03:12.396,118.968,118.958,31.9,64.7 ~ 最終行は改行 1行目は単なる文字列で、不要なデータのため除きます。 必要なデータは2行目からで、必ず、次のような形式になっています。 「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「半角スペース」、「時間2桁」、「:」、「分2桁」、「:」、「秒小数点3桁」、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「,」、「数値」(小数点桁数変動)、「数値」(小数点桁数変動) ちなみに、データが飛ぶことがありますが、必ず時系列になっており、恐らく途中で空白の改行はありません。 そして、データ取得に必要なデータは、年月日と時刻、2つ目の数値です。 上記のデータの2行目の例だとすると、次のようになります。 2003.05.04 21:00:00.626(●必要),118.99(×不要),118.94(●必要),20.8(×不要),0.6(×不要) 次に編集するのは、同じ1分以内の年月日と時刻の「1分間隔の年月日と時刻」、「最初の数値」、「最大値」、「最小値」、「最後の数値」、「1分間のデータの個数」で、1分間隔にしてもらいたいのです。 同じ1分以内の年月日と時刻というのは、「**:**:00.000」から「**:**:59.999」までの間です。「21:01」であれば、「21:01:00.000」から「21:01:59.999」までということになります。 例えば、「2003.05.04 21:01」であれば、上記のデータから抜き出すと次のようになります。また、1分間のデータの個数は5となります。 2003.05.04 21:01:05.362,118.971,118.961(最初の数値),21.5,4 2003.05.04 21:01:21.012,118.983,118.958(最小値),0.6,38.3 2003.05.04 21:01:33.806,118.984,118.964,8.8,35.1 2003.05.04 21:01:51.362,118.986,118.966,76.1,38.1 2003.05.04 21:01:52.171,118.987,118.967(最大値、最後の数値),47.1,39.1 恐らく、同じ1分以内の年月日と時刻のデータが1個だけということはないと思いますがその場合、「最初の数値」、「最大値」、「最小値」、「最後の数値」は全て同じ数値となります。 そして、出力する際、次のような形式にします。 「西暦4桁」、「.」、「月2桁」、「.」、「日にち2桁」、「,」、「時間2桁」、「:」、「分2桁」、「,」、「最初の数値」、「,」、「最大値」、「,」、「最小値」、「,」、「最後の数値」、「1分間のデータの個数」 「2003.05.04 21:01」であれば、編集結果は次のようになります。 2003.05.04,21:01,118.961,118.967,118.958,118.967,5 これを1分間隔で時系列に沿って1行目から、 2003.05.04,21:01~ 2003.05.04,21:02~ 2003.05.04,21:03~ ~ のようにします。 変数を使うのであれば、各変数名を次のようにしてもらいたいです。 「最初の数値」を、Open、 「最大値」を、High、 「最小値」を、Low、 「最後の数値」を、Close、 「1分間のデータの個数」を、Volume ■3. ダイアログで開くように指定し、保存先を決め、編集したデータが入ったテキストファイルが自動的に作成され、保存できるようにします。 ファイル名は、 「元のCSVファイルの左から6文字目まで」、「_」、「最初のデータの西暦4桁」、「.」、「最初のデータの月2桁」、「.」、「最初のデータの日にち2桁」、「.」、「最初のデータの時間4桁」(「:」を除いた時間と分)、「-」、「最後のデータの西暦4桁」、「.」、「最後のデータの月2桁」、「.」、「最後のデータの日にち2桁」、「.」、「最後のデータの時間4桁」(「:」を除いた時間と分) と自動的にファイル名が付けられるようにしてもらいたいです。 例えば、次のような感じです。 ******_2003.05.04.2100-2003.05.30.1459 少し調べたのですが、CSVファイルを開くプログラムは分かったのですが、それ以降のテキストファイルで開き、データを取得などは分かりませんでした。 自分が不勉強で申し訳ないのですが、可能であればこれらのVBAによるプログラムを教えてください。 回答よろしくお願いします。

  • エクセルの条件付きデータ集計について

    はじめまして。 1か月間、機器の消費電力を10分ごとに計測したデータを 日毎・1時間単位で小計計算した表を作成したいのですが、 関数の組み合わせで作業を簡略化できればと、悩んでおります。 データのイメージは以下の通りです。 ○データ 日付    時刻 データ 7月1日   0:00  0.3 7月1日   0:10  0.5 7月1日   0:20  0.4         0:30  0.2         0:40  0.3         0:50  0.2         1:00  0.3   ・     ・    ・   ・     ・    ・   ・     ・    ・   ・     ・    ・ 7月31日 23:50 0.3 ○集計イメージ 日付  時刻  小計 7月1日  0:00   1.9 7月1日  1:00   2.3   ・     ・    ・   ・     ・    ・   ・     ・    ・ 7月31日 23:00 3.0 なお、現在のやり方は (1)0時台であれば、0:00の行の右端に60分分のデータの合計を算出 (2)5行飛ばしにSUM関数で計算 (3)INDEX関数とROW関数を組合せてで5行飛ばしの小計データを抽出 という非常にアナログなやり方をしております。。。 SUMIFS等を試してみましたが、いまいちうまくいきませんでした。。。 良い手があれば、教えてください。 よろしくお願いいたします。

  • Accessでグラフを作りたいのですが

    アクセスは殆ど使用したことがなく 分からないことも多いのですが、 今回はある計測データのグラフを作成したいと考えております。 Excelでもいいのですがデータ点数が86400もあるため データをOffice2003ではグラフかできません。 計測データは1日(24時間)の1秒間隔のデータです。 x軸に時刻、y軸に計測データにしたいです。 よろしくお願いします。

  • テキストデータの処理について

    お世話になります。 入出力ソースを作成したいのですが 下記の例のようなデータに適している クラス・メソッドはありますでしょうか。 勉強できるサイトをご存知の方 もしくはサンプルデータや解説等などあるサイト等 ありましたらアドバイス頂けると助かります。 どうぞよろしくお願いいたします。 例 テキストデータ 出力前 1行目 2行目 3行目 4行目 5行目 6行目 出力後 (1レコード目)1行目,2行目 (2レコード目)3行目,4行目 (3レコード目)5行目,6行目

    • ベストアンサー
    • Java
  • ACCESS2013 データのエクスポート方法

    ACCESS2013を使用しています。(初心者) テーブルデータをCSVファイル形式で出力する際、1,2行目にタイトル等を入れ、3行目からテーブルデータを出力したいと考えています。 方法が見つからないため、どうすればできるのか教えてください。