2011-06-02 56 views
1

我有一个CHANGES表,其中有VALUE(integer)和CREATED_AT(timestamp)字段。我想知道按过去30天的每个日期分组的VALUE列的总数(未进行30次查询)。日期范围内的SQL计数总数

因此,如果昨天有记录用10,-7和12的VALUE创建;我想要一个记录返回与CREATED_AT =昨天和TOTAL = 15.

任何帮助吗?

+0

您标记3个不同的数据库系统,哪一个你真的使用? – piotrm 2011-06-02 02:03:20

+0

mysql,但我希望不依赖于该查询。 – tybro0103 2011-06-02 02:04:59

回答

4
SELECT date(created_at) as CREATED_AT, sum(value) as TOTAL 
FROM changes 
WHERE created_at >= curdate() - interval 30 day 
GROUP BY date(created_at); 
+0

会按日期分组吗? – tybro0103 2011-06-02 02:16:05

+0

是的,date()返回datetime/timestamp的日期部分。 – piotrm 2011-06-02 02:21:09

+2

使用常量CURRENT_DATE,这是SQL标准,可用于许多数据库。函数curdate()仅用于MySQL。 – 2011-06-02 06:05:14

1

那么,它稍微取决于时间戳的格式(SQL/Unix/etc)。但是,这种类型的查询可能会帮助您一起:

​​
+0

这是一个好的开始 - 它计算每天的行数。如果您使用SUM(VALUE)而不是COUNT(VALUE),则会添加它们。如果您使用'%Y-%m',它将按月分组。按30天的时间分组,您需要做一些日期数学TRUNCATE(DAYS(TODAY - CREATED_AT)/ 30)。不幸的是,TRUNCATE,DAYS和TODAY可能不是数据库的实际名称。 – karmakaze 2011-06-02 02:15:11

+0

噢,对不起...忘了他想每30天分组一次。如果可以每月对它们进行分组,则他可以将查询更改为:DATE_FORMAT(CREATED_AT, '%Y-%m')。如果您想坚持30天,并在执行查询的那一天开始计算这30天,这将不起作用。并且@karmakaze;我不知道为什么你会提出SUM()函数,但我认为VALUE值只是一个随机ID。通过增加这些数据,它没有提及那个月/ 30天的生日庆祝的人数。 – 2011-06-02 02:28:46

+0

我相信在过去的30天里我可以只添加“where created_at> [30天前]”。总和是我正在寻找的功能。 – tybro0103 2011-06-02 02:34:24