2015-04-20 10 views
5

Ich habe versucht, eine kumulative Summe einer booleschen Spalte pro Tag zu erhalten. Ich habe verschiedene Möglichkeiten mit entweder #sum versucht und auch #distinct nachgeschlagen (durch Blick auf andere Beiträge auf Stack Overflow), aber nicht in der Lage, eine dieser Methoden auf eine Weise erfolgreich implementieren, wie ich meine Hash sehen möchten.Abfrage einer kumulativen Summe einer booleschen Spalte pro Tag

Derzeit ist dies die Abfrage Ich habe:

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

Was mich ergibt dies:

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

Aber ich würde es so aussehen mag:

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

I verwende Rails 4 und Postgres. Jede Hilfe wäre willkommen.

Edit:

ich dies tun landete, um die kumulative Summe zu erhalten, obwohl dies wahrscheinlich nicht der beste Weg, oder elegant überhaupt ist:

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) 

ich etwas am Ende immer wie Dies ist:

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

Was funktioniert jetzt, bis ich einen besseren Weg finden kann.

+0

Welcher ist der Unterschied zwischen 18 Apr 2015 => 44 und 18 Apr 2015 => 92 zum Beispiel? Können Sie uns zeigen, einige Daten des Geräts Tabelle – Tanorix

+0

@Tanorix Dieser Unterschied ist, dass am 18. April 44 Geräte boxed wurden, aber insgesamt 92 Boxen wurden bis jetzt verpackt, indem die Summe für 17. April und 18. April hinzugefügt. –

+0

Sie möchten also, dass die Zählungen insgesamt und nicht pro Datum gezählt werden? –

Antwort

0

eine kumulative Summe einer boolean Spalte pro Tag abfragen:

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

Danke für Ihre Antwort. Ich habe diese Abfrage früher versucht und einige verrückte Zahlen bekommen. Das ist, was ich bekomme, wenn ich diese Abfrage versuchte: {Fr, 17 Apr 2015 => 967220016, Sa, 18 Apr 2015 => 886618392, So, 19 Apr 2015 => 100752095, Mo, 20 Apr 2015 => 967220160} –

1

ich Ihre SQL halten würde wie

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

und führen Sie dann die benutzerdefinierte Aggregation in Ruby

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

der obige Rubin könnte etwas aufgeräumt werden, aber ...

Eine andere Sache achten Sie auf - subtile Zeitzone gibt

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

je nachdem, wo die Benutzer die Berichte dieser gerade die Zählungen nicht zurückkehren kann oder sie

  • Postgres AT TIME ZONE erwarten könnte help you in diesem Fall
+1

Vielen Dank für deine Antwort. Ich habe etwas ziemlich ähnliches gemacht (was ich auf meine Frage geschrieben habe). Danke für den Zeitzonen-Tipp, das werde ich mir merken. –

Verwandte Themen