2016-07-05 15 views
-2

背景: 現在、1日あたり約100サイトから1年365日のデータ行を受け取っています。サイト数は月に13サイト前後に増えています。私は長期的な解決策を探しています。SQL複数の列にゼロ以外の値が含まれているかどうかを確認する最も簡単な方法

構造は次のとおりです。

id:int 
site:int 
created:datetime 
dept_a:decimal(12,2) 
dept_b:decimal(12,2) 
... 
dept_y:decimal(12,2) 
dept_z:decimal(12,2) 

問題:

私が今までサイトのそれぞれについて、dept_x各列における非ゼロのエントリーがあったかどうかを知りたいです s。

あり、30秒のサーバータイムアウトがあり、かつ

if(sum(dept_x)>0,1,0) as dept_x_used, if(sum(dept_y)>0,1,0) as dept_y_used, ... 

の私の現在のソリューションは、現在動作し、かなり迅速に作品が、私が構築していますシステムは、複数のサイトをサポートし、まだ見に戻って検索する必要がありますdept_xにゼロ以外の値がある場合。

懸念されているのは、検索されるデータの量が絶えず増加していることと、毎日の新しいデータの量が増えていることです。

可能であれば、最初からすぐにそれを行うことは避ける方が良いでしょうし、あまりにも遅くなったときに後で戻ってそれを修正する必要があります。

また、ゼロ以外の値を持つ列に関する情報を格納する別のテーブルなど、これを処理する別の方法もあります。

いくつかのサンプルデータ:

1, 1, 2016-03-01, 53.00, 0.00, 0.00, 0.00, 30.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 
2, 7, 2016-03-01, 26.00, 15.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 
3, 6, 2016-03-01, 0.00, 0.00, 0.00, 0.00, 23.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 
4, 2, 2016-03-01, 14.00, 6.00, 0.00, 0.00, 13.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 
5, 2, 2016-03-02, 55.00, 0.00, 32.00, 0.00, 18.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 
6, 4, 2016-03-02, 3.00, 0.00, 4.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ... 

この場合、出力はそう、目的は部門コードは、これまでサイト上で使用されているかどうかを判断することです

site dept_a_used dept_b_used dept_c_used dept_d_used dept_e_used 
1 1   0   0   0   1 
2 1   1   1   0   1 
4 1   0   1   0   0 
6 0   0   0   0   1 
7 1   0   0   0   0 

ようなものになるだろう月例レポートにこれまでに使用された部門がすべて含まれていることを確認できます。他のすべてのレポートには、「すべての部門の月次レポート」または「選択された部門の月次レポート」などの記述子がありますが、このレポートは区別されません。レポートが生成されたときにレポートを管理することはできません。正しい部門が含まれていない場合は報告してください。

+1

サンプルデータを追加できますか? –

+0

これを見てくれてありがとう、私はいくつかのデータとこれをやろうとしている理由の説明を追加しました。 – Graham

+0

'dept_x'パターンは普通のフォーム違反のように聞こえるので私にはバグがあります - それを変更できますか?とにかく、 'WHERE'節に日付を追加してクエリを絞り込み、それを使ってインデックスを作成すれば、うまくいくでしょう。 –

答えて

0

まず、私はプログラミングの専門家でも英語でもないが、私はあなたのためのアイデアを持っているかもしれない。

なぜあなたは=> 1か「この行は、まだチェックされていない」=> 0

場合は、「この行はすでに確認されています」と言うのデータのあなたの行に情報を保存しません一度だけチェックされた行を再チェックする必要はありません。新しい行の情報が「0」の行のみ検証を行うことができます。この方法では、データの量はすべての行をチェックするよりも小さくなります。

私はあなたの問題を理解していただければ幸いです。

アルノー

+1

おそらく、その指標が列の値の唯一の用途ではないかもしれない –

+1

私はあなたが何を言っているのか分かりませんが、私の答えでは、値をチェックする必要があるテーブルに新しい列を追加することを意味し、この新しい列には、行がすでにチェックされているかどうかを示す情報が格納されます。 – Arnaud

関連する問題