4

私は現在、プロセスやCPU使用率、バッテリー使用率などに関する多くの情報をテーブルに収集するプロジェクトを行っています。

たとえば、「ログテーブル」には「プロセス」、「ピッド」、「バッテリー」の列が含まれ、別のテーブル「CPUテーブル」には「プロセス」、「CPU時間」、「CPU使用率」などが含まれます。プログラムはこれらすべてのテーブルに同時に書き込むため、各読み取りにはすべてのテーブルにまたがる独自の行があります。

このすべての情報を取得し、すべてのプロセスに対して個別のCSVファイルを作成するプログラムを作成しました。これらのファイル内に、その特定のプロセスに関する4つのテーブルすべてからのすべての情報が必要です。

私が抱えている問題は、何らかの理由で、情報を取り込もうとすると、テーブルの1つが、他のテーブルのすべてのレコードのレコードを複製することです。

問題

ご覧のとおり、「ログテーブル」の情報は正しく書き出されますが、「CPUテーブル」(右端の7列)の情報は、「ログ」のエントリごとに最初のレコードを繰り返し、その後、次に、ログのすべてのレコードに対して。

Procs [i]には、すべての一意のプロセス名が含まれています。

現在、私が使用しているsqlステートメントはであり、周囲の基本的なコードは次のとおりです。

String query = "SELECT * FROM log, cpuinfo WHERE log.Process = " + "'" + procs[i] + "'" + " AND cpuinfo.Process = " + "'" + procs[i] + "'";
                System.out.println(query);
                rs = sment.executeQuery(query);

                writer = new CSVWriter(new FileWriter(procs[i] + ".csv"), ',');
                //writer = new CSVWriter(procs[i] + ".csv");
                //System.out.println("Writing.....");



                //rs.beforeFirst();

                writer.writeAll(rs, true);
                //writer.

                writer.flush();

プログラムがこれを実行し、CSVをこのように記述している理由を誰かが理解できますか?どんな助けでも大歓迎です、何週間もこのプログラムにとどまっていて無駄になり、Googleは助けていません!

ありがとう。

確認するための情報やコードが必要な場合は、質問してください。

4

2 に答える 2

2

logここでは、2つのテーブルの内部結合を暗黙的に実行しているため、からの1つのレコードをcpuinfoからの1つのレコードに適切に関連付ける方法を決定する必要があります。記述されたクエリは、からのすべてのレコードと結合されたすべてのレコードの結果レコードを効果的に作成します。次に、句は、その結果セットを、プロセスが一致するレコードのみに制限します。logcpuinfologcpuinfoWHERE

これはあなたが望むものではないようです。プロセスが一致し、タイムスタンプも一致するレコードを関連付けたいと思われます。単純に、これは次のようになります。

SELECT * FROM log, cpuinfo WHERE log.Process = ?  AND cpuinfo.Process = ? 
  AND log.Timestamp = cpuinfo.Timestamp

ただし、実際には、タイムスタンプを単純に比較するよりも、ソリューションの方が少し複雑だと思います。あるテーブルのタイムスタンプを別のテーブルに一致させる方法があるようですが、関連付けられているタイムスタンプが同一ではない可能性があります。たとえば、の最も早いタイムスタンプは、のlog26:04.3ではなく、26:04.2のようになりcpuinfoます。アプリケーションロジックに基づいて、2つのタイムスタンプを相互に関連付けることが理にかなっている方法を決定する必要があります。WHEREこれは、それに応じて条項に影響を与えます。

于 2013-01-30T15:09:58.560 に答える
0

以下が機能し、重複するレコードを削除する必要があります。

Select * FROM log, cpuinfo WHERE log.Process = cpuinfo.Process and      log.Process = ?
于 2013-01-30T15:04:05.923 に答える