4

登録ユーザー数(日別)のグラフを作成したい

Googleチャートを使用するので、使用するデータが必要です

登録ユーザーを日ごとにカウントする SQL クエリを作成しました

SELECT DATE(created_at), COUNT(DISTINCT id) amount 
FROM users 
GROUP BY DATE(created_at)

これにより、データとユーザー数のハッシュが返されます

{"date"=>"2013-09-24", "amount"=>"100"} 
{"date"=>"2013-09-26", "amount"=>"1"} 
{"date"=>"2013-10-01", "amount"=>"2"} 

問題:

のように、新規ユーザーがいない日は 0 件の登録を表示したい

{"date"=>"2013-09-25", "amount"=>"0"}

(私はpgデータベースを使用しています。また、このクエリをレールアプリで使用しているため、ActiveRecordを使用してアドバイスをいただけますか)


                           **UPDATE**

私のレールアプリケーションでは、この問題をそのような方法で見つけました

#controller
  def charts
    users = User.select([:id, :created_at])
    @data = users.where("created_at >= ?", Date.today - 1.month)
    @inf = [] 
    @date = [] 
    month = Date.today - 1.month
    month.upto(Date.today).each do |date| 
      @date << date.strftime('%d/%m')   
      @inf << @data.select{|u| u.created_at.to_date == date }.size
    end 
  end

@infと配列に@dateは、登録ユーザーと日付の数があります。

4

2 に答える 2

0

考慮したいすべての日付のソースが必要になります。

例: 最初のエントリから現在まで

WITH cte_days 
AS 
( 
    SELECT MIN(DATE(created_at)) AS [Day] FROM USERS -- First registered User
    UNION ALL 
    SELECT DATEADD(dd, 1, [Day]) 
    FROM cte_days
    WHERE DATEADD(dd, 1, [Day]) < GETDATE() -- Stop at today
)
SELECT [Day], COUNT(DISTINCT id) amount 
FROM cte_days LEFT JOIN users ON [Day] = DATE(created_at)
GROUP BY [Day]
于 2013-10-01T11:23:47.453 に答える
0

あなたが使用しているデータベースはわかりませんが、誰もこれに答えていないので、これがMSSQLでの方法です

  DECLARE @MinDate DATETIME
  DECLARE @MaxDate DATETIME
  SET @MinDate = '01 Jan 2013'
  SET @MaxDate = '31 Jul 2013'

  ;with d(date) as (
  select @MinDate
  union all
  select date+1
  from d
  where date < @MaxDate
  )
  select d.date created_at, COUNT(DISTINCT u.id) amount
   from d
   left join users u
        on u.created_at = d.date
     GROUP BY d.date
    OPTION (MAXRECURSION 0) 

OPTION (MAXRECURSION 0)100日を超える日付範囲のみが必要です

于 2013-10-01T11:28:24.650 に答える