SQL 准备数据以显示图表
Posted
技术标签:
【中文标题】SQL 准备数据以显示图表【英文标题】:SQL prepare data to display charts 【发布时间】:2013-10-01 10:38:31 【问题描述】:我想建立注册用户图表(每天)
我将使用谷歌图表,所以我应该有数据可以使用
我写了一个按天统计注册用户数的 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
数组中,我有注册用户数和日期。
【问题讨论】:
【参考方案1】:您将需要您希望考虑的所有日期的来源。
例如从第一次进入到现在
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]
【讨论】:
【参考方案2】:我不知道您正在使用的数据库,但由于没有人回答这个问题,但这就是我在 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 天
【讨论】:
以上是关于SQL 准备数据以显示图表的主要内容,如果未能解决你的问题,请参考以下文章