2014-01-15 61 views
1

我试图运行此查询或东西,将产生从Rails的输出相似:多COUNT(DISTINCT)作为GROUP BY在Rails的

SELECT 
COUNT(DISTINCT columnName = 'Value1') AS Value1, 
COUNT(DISTINCT columnName = 'Value2') AS Value2, 
COUNT(DISTINCT columnName = 'Value3') AS Value3, 
COUNT(DISTINCT columnName = 'Value4') AS Value4, 
COUNT(DISTINCT columnName = 'Value5') AS Value5, 
COUNT(DISTINCT columnName = 'Value6') AS Value6, 
COUNT(DISTINCT columnName = 'Value7') AS Value7, 
COUNT(DISTINCT columnName = 'Value8') AS Value8, 
COUNT(DISTINCT columnName = 'Value9') AS Value9, 
COUNT(DISTINCT columnName = 'Value10') AS Value10, 
COUNT(DISTINCT columnName = 'Value11') AS Value11, 
COUNT(DISTINCT columnName = 'Value12') AS Value12, 
COUNT(DISTINCT columnName = 'Value13') AS Value13, 
COUNT(DISTINCT columnName = 'Value14') AS Value14, 
COUNT(DISTINCT columnName = 'Value15') AS Value15, 
unix_timestamp(timestamp) div 300 AS unix_timestamp_timestamp_div_300 
FROM `table` WHERE (timestamp > '2013-12-15 15:50:00 -0800') 
GROUP BY unix_timestamp(timestamp) div 300 

我已经试过.Count中的多个版本的选项,并没有和.group,都没有运气。

编辑: 为了澄清,我们的目标是每5分钟获得一行,并计算5分钟内每个Value#标签有多少行。这将被用来为每个Value#创建一个包含数据序列的图。

编辑2戈登Linhoff指出的下方,查询应该是:

SELECT 
    sum(columnName = 'Value1') AS Value1, 
    sum(columnName = 'Value2') AS Value2, 
    sum(columnName = 'Value3') AS Value3, 
    sum(columnName = 'Value4') AS Value4, 
    sum(columnName = 'Value5') AS Value5, 
    sum(columnName = 'Value6') AS Value6, 
    sum(columnName = 'Value7') AS Value7, 
    sum(columnName = 'Value8') AS Value8, 
    sum(columnName = 'Value9') AS Value9, 
    sum(columnName = 'Value10') AS Value10, 
    sum(columnName = 'Value11') AS Value11, 
    sum(columnName = 'Value12') AS Value12, 
    sum(columnName = 'Value13') AS Value13, 
    sum(columnName = 'Value14') AS Value14, 
    sum(columnName = 'Value15') AS Value15, 
    unix_timestamp(timestamp) div 300 AS unix_timestamp_timestamp_div_300 
FROM `table` 
WHERE (timestamp > '2013-12-15 15:50:00 -0800') 
GROUP BY unix_timestamp(timestamp) div 300 

因此,MySQL是现在固定,在获取的Rails返回的东西,除了一堆=>零个对象模型的任何帮助吗?

+0

为什么不添加columnName到GROUP? Value1,2,3等是否真的需要在单独的列中?和....(DISTINCT columnName ='string')与DISTINCT(IF(columnName ='string',1,0))相同,它可能不是你所需要的。 – aconrad

回答

0

我想出了内在戈登的回答后,下面的解决方案。

pollEvery = 300 # Five Minutes 
graphLength = 2592000 # About a month 
now = (Time.now.utc.to_i/pollEvery) * pollEvery 
start_time = now - graphLength 

distinctValues = ModelName.where("created_at > ?", start_time).uniq.pluck(:columnName) 

sumClauses = Array.new 
distinctValues.each do |value| 
    clause = "SUM(hangup_cause = '#{value}') AS #{value}" 
    sumClauses.push(clause) 
end 

selectClause = sumClauses.join(', ') + ", created_at" 

data = ModelName.group("unix_timestamp(created_at) div #{pollEvery}").select(selectClause).where('created_at > ?', Time.at(start_time)) 

data.each do |row| 
    # You can loop through the distinctValues to get the data 
    # using row[value] in a distinctValues.each do |value| loop 
    # The created_at timestamp for each grouping is available as well 
end 
0

您的count(distinct)将返回0或1,具体取决于行是否与条件匹配。也就是说,只有条件返回两个值,0或1更改count(distinct)sum()

SELECT 
    sum(columnName = 'Value1') AS Value1, 
    sum(columnName = 'Value2') AS Value2, 
    sum(columnName = 'Value3') AS Value3, 
    sum(columnName = 'Value4') AS Value4, 
    sum(columnName = 'Value5') AS Value5, 
    sum(columnName = 'Value6') AS Value6, 
    sum(columnName = 'Value7') AS Value7, 
    sum(columnName = 'Value8') AS Value8, 
    sum(columnName = 'Value9') AS Value9, 
    sum(columnName = 'Value10') AS Value10, 
    sum(columnName = 'Value11') AS Value11, 
    sum(columnName = 'Value12') AS Value12, 
    sum(columnName = 'Value13') AS Value13, 
    sum(columnName = 'Value14') AS Value14, 
    sum(columnName = 'Value15') AS Value15, 
    unix_timestamp(timestamp) div 300 AS unix_timestamp_timestamp_div_300 
FROM `table` 
WHERE (timestamp > '2013-12-15 15:50:00 -0800') 
GROUP BY unix_timestamp(timestamp) div 300 
+0

啊,人......你是正确的。这绝对应该是这样。我仍然需要让Rails得到你的查询返回的结果,但这更接近我所需要的。谢谢。 –