背景: 我有一张表,当前每天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子句中添加一个日期来缩小查询范围,并用它创建一个索引,那么你将会很好。 –