2016-07-05 70 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

相关问题