railsでdbがsqliteの時に時間ごとにデータを集計する方法

#はじめに
時間ごとにデータを集計したいと思ったが良い方法が思いつかずこんな頭のおかしいことをしていた。

```ruby
require 'active_support/concern'

module TimeRecord
    extend ActiveSupport::Concern 

    included do 
        now_time = Time.now

        one             = now_time - 60*60 
        two             = now_time - 60*60*2
        three           = now_time - 60*60*3
        four            = now_time - 60*60*4
        five            = now_time - 60*60*5
        six             = now_time - 60*60*6
        seven           = now_time - 60*60*7
        eight           = now_time - 60*60*8
        nine            = now_time - 60*60*9
        ten             = now_time - 60*60*10
        eleven          = now_time - 60*60*11
        twelve          = now_time - 60*60*12
        thirteen        = now_time - 60*60*13
        fourteen        = now_time - 60*60*14
        fifteen         = now_time - 60*60*15
        sixteen         = now_time - 60*60*16
        seventeen       = now_time - 60*60*17
        eighteen        = now_time - 60*60*18
        nineteen        = now_time - 60*60*19
        twenteen        = now_time - 60*60*20
        twenteeone      = now_time - 60*60*21
        twenteetwo      = now_time - 60*60*22
        twenteethree    = now_time - 60*60*23
        twenteefour     = now_time - 60*60*24
        twenteefive     = now_time - 60*60*25

        scope :one_hour,            -> {where(created_at: one..now_time)}
        scope :two_hour,            -> {where(created_at: two..one)}
        scope :three_hour,          -> {where(created_at: three..two)}
        scope :four_hour,           -> {where(created_at: four..three)}
        scope :five_hour,           -> {where(created_at: five..four)}
        scope :six_hour,            -> {where(created_at: six..five)}
        scope :seven_hour,          -> {where(created_at: seven..six)}
        scope :eight_hour,          -> {where(created_at: eight..seven)}
        scope :nine_hour,           -> {where(created_at: nine..eight)}
        scope :ten_hour,            -> {where(created_at: ten..nine)}
        scope :eleven_hour,         -> {where(created_at: eleven..ten)}
        scope :twelve_hour,         -> {where(created_at: twenteen..eleven)}
        scope :thirteen_hour,       -> {where(created_at: thirteen..twenteen)}
        scope :fourteen_hour,       -> {where(created_at: fourteen..thirteen)}
        scope :fifteen_hour,        -> {where(created_at: fifteen..fourteen)}
        scope :sixteen_hour,        -> {where(created_at: sixteen..fifteen)}
        scope :seventeen_hour,      -> {where(created_at: seventeen..sixteen)}
        scope :eighteen_hour,       -> {where(created_at: eighteen..seventeen)}
        scope :nineteen_hour,       -> {where(created_at: nineteen..eighteen)}
        scope :twenteen_hour,       -> {where(created_at: twenteen..nineteen)}
        scope :twenteeone_hour,     -> {where(created_at: twenteeone..twenteen)}
        scope :twenteetwo_hour,     -> {where(created_at: twenteetwo..twenteeone)}
        scope :twenteethree_hour,   -> {where(created_at: twenteethree..twenteetwo)}
        scope :twenteefour_hour,    -> {where(created_at: twenteefour..twenteethree)}
        scope :twenteefive_hour,    -> {where(created_at: twenteefive..twenteefour)}
    end 
end 
```

これをすべて実行して集計していたがさすがにやばいの集計する方法を探しました。

#Model.group("DATE_FORMAT(created_at,'%Y-%m-%d')").countが使えない

どうやらpostgresqlならModel.group("DATE_FORMAT(created_at,'%Y-%m-%d')").countみたいな感じで集計できるようだがsqliteの場合出来ない（多分）


#sqlを実際に書いて実行する。

しかたないのでsql文を実際に書いて集計することにしました。


sql文を実行するには

```ruby
sql = <<-EOS
SELECT * FROM table;
EOS
```

みたいに書いて

```ruby 
ActiveRecord::Base.connection.select_all(sql)
```

で実行できる。

これを利用して時間ごとの集計を行った。

結果がこれ

```ruby
@@sql_count = <<-EOS
SELECT strftime('%Y-%m-%d-%H', created_at), COUNT(*)
FROM model
WHERE category = 0
GROUP BY strftime('%Y-%m-%d-%H', created_at)
ORDER BY created_at DESC;
EOS
    
    
    def self.data_events_all_count 
        datas = ActiveRecord::Base.connection.select_all(@@sql_events_all).to_hash  
        count_array = []
        datas.each do |data|
            count_array << data["COUNT(*)"]
        end 
        return count_array.take(50).reverse
    end 
```


みたいな感じ。

strftime('%Y-%m-%d-%H',created_at)

で年、月、日、時間を得られます。
後はそれをgroup byで集計してあげれば時間ごとの集計が行えます。

得られるsqlの結果をハッシュの形にしているので結果としてdatasの中身は配列の中にハッシュがある形になります。

なのでループしてあげてその中でCOUNT(*)の値、要は合計の値をcount_arrayに入れています。