4

我想建立注册用户图表(每天)

我将使用谷歌图表,所以我应该有数据可以使用

我写了一个按天计算注册用户的 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 数据库,我也在 rails 应用程序中使用了这个查询,所以你可以使用 ActiveRecord 给我一个建议)


                           **UPDATE**

对于我的 Rails 应用程序,我以这种方式解决了这个问题

#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 回答