2016-07-05 68 views
-2

背景: 我有一張表,當前每天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部門的月度報告」,但是這個報告沒有區別,並且在生成報告時我們無法控制這些報告,我們只能檢查它們如果他們沒有包含正確的部門,請回報。

+1

您可以添加一些示例數據嗎? –

+0

感謝您關注此問題,我添加了一些數據和解釋爲什麼我正在嘗試這樣做。 – Graham

+0

'dept_x'模式讓我感到不適,因爲它聽起來像是一種正常的形式侵犯 - 你能改變它嗎?無論如何,如果你可以通過在WHERE子句中添加一個日期來縮小查詢範圍,並用它創建一個索引,那麼你將會很好。 –

回答

0

首先,我不是編程方面的專家,也不是英文的,但我可能有一個想法給你。

你爲什麼不保存您的數據排它說:「這行已經檢查」 => 1或「該行還沒有被檢查」 => 0

如果信息您不必重新檢查一次檢查過的行,就可以執行此操作,然後僅在新列上具有「0」信息的行上進行驗證。通過這種方式,數據量將小於檢查每一行。

我希望我理解你的問題,它可以幫助你。

Arnaud

+1

也許該指標不是唯一用於列值的值 –

+1

我不確定我明白你在說什麼,在我的回答中,我的意思是在表中添加一個新列,在這個表中必須檢查值,並在這個新列上存儲一個信息,說明該行是否已經被檢查過。 – Arnaud

相關問題