2015-04-20 18 views
5

Günde bir boolean sütununun birikimli toplamını almaya çalışıyorum. #sum'u kullanarak farklı yollar denedim ve #distinct'u da baktım (Stack Overflow'taki başka mesajlara bakarak), ancak bu yöntemlerden birini, benim hash'ımın görünmesini istediğim şekilde başarıyla uygulayamadım.Günde bir boolean sütununun toplam bir miktarını sorgulama

Device.where(boxed: true).group('date(updated_at)').count 

bana bu verir:

Şu anda, bu ben sorgusudur

{Fri, 17 Apr 2015=>48, Sat, 18 Apr 2015=>44, Sun, 19 Apr 2015=>5, Mon, 20 Apr 2015=>48} 

Ama böyle bakmak istiyorum:

{Fri, 17 Apr 2015=>48, Sat, 18 Apr 2015=>92, Sun, 19 Apr 2015=>97, Mon, 20 Apr 2015=>145} 

ben Rails 4 ve Postgres kullanıyorum. Herhangi bir yardım takdir edilecektir.

Düzenleme:

data_all_time = Device.where(boxed: true).group('date(updated_at)').count 
data_all_time_keys = data_all_time.keys 
data_all_time_values = data_all_time.values 
sum = 0 
data_all_time_values.map!{|x| sum += x} 

all_time_sum_tuple = data_all_time_keys.zip(data_all_time_values) 

ben gibi bir şey elde sonunda: Ben bu muhtemelen hiç iyi yolu ya da zarif olmasa da, kümülatif toplamı almak için bunu sona erdi

Bu, daha iyi bir yol anlayabilmem için şimdiye kadar hangisi işe yarıyordur?

[["April 17, 2015", 48], ["April 18, 2015", 92], ["April 19, 2015", 97], ["April 20, 2015", 145]] 

+0

Beetwen arasındaki fark 18 Nis 2015 => 44 ve 18 Nis 2015 => 92 örneğin? Bize Device Device – Tanorix

+0

@tanorix'in somes verilerini gösterebilir misiniz? Bu fark 18 Nisan'da 44 kutuda kutulanmış, ancak toplamda 17 kutu ve 18 Nisan'a kadar toplamda 92 kutu kutulandırılmış. –

+0

Böylece sayımların, sayım sayısı yerine toplamları çalıştırmasını mı istiyorsunuz? –

cevap

0
günde bir boolean sütunun kümülatif toplamı sorgulama

:

data = Device.where(boxed: true).group('date(updated_at)').count 

olduğu gibi sizin sql tutacak

Device.where(boxed: true).group('date(updated_at)').sum('date(updated_at)') 
+0

Cevabınız için teşekkürler. Bu sorguyu daha önce denedim ve çılgın numaralar aldım. Bu sorguyu denediğimde aldığım şey: {Cum, 17 Nisan 2015 => 967220016, Sat, 18 Nisan 2015 => 886618392, Paz, 19 Nis 2015 => 100752095, Pzt, 20 Nisan 2015 => 967220160} –

1

ve ardından Yakut özel agregasyonunu yapmak

result = {} 
keys = [] 
data.each_with_index do |(key, value), index| 
    keys << key 
    result[key] = data.values_at(*keys).sum 
end  

Yukarıdaki rubi biraz temizlenmiş olabilir, ama ...

dikkat edilmesi gereken

Bir başka şey - ince saat diliminde kullanıcıların veya bekledikleri sayıları dönmek olmayabilir bundan raporları görüntülerken yere bağlı

-- your data is probably stored in UTC and this will group by the UTC dates 
'date(updated_at)' 

sorunları

  • postgres AT TIME ZONE kudreti Bu durumda size yardımcı olur
+1

Teşekkürler cevabın için. Buna oldukça benzer bir şey yaptım (ki bu soruya gönderdim). Saat dilimi ipucu için teşekkürler, bunu aklımda tutacağım. –