2016-10-04 61 views
0

我正在处理基本上看起来像这样的数据。更高效的查询来计算组范围内的值

表:processed_data

sensor_id, reading, time_stamp 
1,0.1,1234567890 
1,0.3,1234567891 
1,0.9,1234567892 
1,0.32,1234567893 
... 

我想要做的就是进行查询,可以使一个遍历数据,并指望有多少读数是在每个类别。简单的例子,

类别(0-0.5,0.5-0.7,0.7-1)(我实际上计划将它们分成10个类别,但增量为0.1)。

这基本上是我想要的东西,即使它是不是有效的SQL:

select count(reading between 0 and 0.5), count(reading between 0.5 and 0.7), count(reading between 0.7 and 1) from processed_data; 

我能想到的,虽然这样做的唯一方法,就是做一个O * N的操作,而不是1个时间循环。

select count(*) as low from processed_data where reading between 0 and 0.5 
union 
select count(*) as med from processed_data where reading between 0.5 and 0.7 
union 
select count(*) as high from processed_data where reading between 0.7 and 1; 

我可能只是诉诸做在PHP中处理和一次扫描的数据,但我宁愿SQL做到这一点,如果能足够聪明。

+0

在MySQL中,“是不是有效的SQL”实际上几乎工作...因为COUNT递增每个非null值(即0和1),你想要使用SUM()聚合来代替COUNT()。否则,该查询将在MySQL中起作用。我希望相同的查询可以在sqllite中工作。在MySQL中,“读取0和0.5之间”这个表达式对于更符合可移植性和ANSI标准的应用来说是简短的:“'当读取0和0.5之间的值时读取0,然后读取0.5,然后读取0和0.5之间的值时, ”。 – spencer7593

+0

哦,有趣。实际上,我正在研究如何将案例用于我正在做的更复杂的版本。我认为'案例'可能是我真正的答案。 –

回答

1

您可以从价值导出的类别,并利用它来进行分组:

SELECT CAST(reading * 10 AS INTEGER), 
     COUNT(*) 
FROM processed_data 
GROUP BY CAST(reading * 10 AS INTEGER);