背景: 我有一張表,當前每天365天每天從大約100個站點接收一行數據。網站數量每月增加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
的目的是確定部門代碼曾經被在網站上使用過,所以我們可以驗證每月報告包含所有曾經使用過的部門。我們所有的其他報告都有一個描述符,例如「所有部門的月度報告」或「SELECTED部門的月度報告」,但是這個報告沒有區別,並且在生成報告時我們無法控制這些報告,我們只能檢查它們如果他們沒有包含正確的部門,請回報。
您可以添加一些示例數據嗎? –
感謝您關注此問題,我添加了一些數據和解釋爲什麼我正在嘗試這樣做。 – Graham
'dept_x'模式讓我感到不適,因爲它聽起來像是一種正常的形式侵犯 - 你能改變它嗎?無論如何,如果你可以通過在WHERE子句中添加一個日期來縮小查詢範圍,並用它創建一個索引,那麼你將會很好。 –