背景: 現在、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
ようなものになるだろう月例レポートにこれまでに使用された部門がすべて含まれていることを確認できます。他のすべてのレポートには、「すべての部門の月次レポート」または「選択された部門の月次レポート」などの記述子がありますが、このレポートは区別されません。レポートが生成されたときにレポートを管理することはできません。正しい部門が含まれていない場合は報告してください。
サンプルデータを追加できますか? –
これを見てくれてありがとう、私はいくつかのデータとこれをやろうとしている理由の説明を追加しました。 – Graham
'dept_x'パターンは普通のフォーム違反のように聞こえるので私にはバグがあります - それを変更できますか?とにかく、 'WHERE'節に日付を追加してクエリを絞り込み、それを使ってインデックスを作成すれば、うまくいくでしょう。 –