【问题标题】:SQL Count Totals Within Date Ranges日期范围内的 SQL 计数总计
【发布时间】:2011-06-02 01:58:40
【问题描述】:

我有一个 CHANGES 表,其中包含字段 VALUE(整数)和 CREATED_AT(时间戳)。我想知道过去 30 天每天分组的 VALUE 列的总数(不进行 30 次查询)。

因此,如果昨天创建了 VALUE 为 10、-7 和 12 的记录;我希望返回一条 CREATED_AT = 昨天和 TOTAL = 15 的记录。

有什么帮助吗?

【问题讨论】:

  • 您标记了 3 个不同的数据库系统,您真正使用的是哪一个?
  • mysql,但我希望查询不依赖于它。

标签: mysql sql sqlite postgresql


【解决方案1】:
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);

【讨论】:

  • 将“按日期分组”按天分组吗?
  • 是的,date() 返回日期时间/时间戳的日期部分。
  • 使用常量 CURRENT_DATE,这是 SQL 标准,适用于许多数据库。函数 curdate() 仅适用于 MySQL。
  • @piotrm - 我们如何使用日期范围代替 curdate() 来获取每月、每周、每日计数?
【解决方案2】:

嗯,这稍微取决于时间戳的格式(SQL/Unix/等)。但是这种类型的查询可能会对您有所帮助:

SELECT
   DATE_FORMAT(CREATED_AT, '%Y-%m-%d') ym,
   COUNT(VALUE)
FROM foo
GROUP BY ym

【讨论】:

  • 这是一个好的开始——它计算每天的行数。如果您使用 SUM(VALUE) 而不是 COUNT(VALUE) 它将添加它们。如果你使用'%Y-%m',它将按月分组。要按 30 天时间段分组,您需要做一些日期数学运算 TRUNCATE(DAYS(TODAY - CREATED_AT)/30)。不幸的是,TRUNCATE、DAYS 和 TODAY 可能不是您数据库的实际名称。
  • 哦,抱歉……忘了他想每 30 天对它们进行一次分组。如果可以每月对它们进行分组,他只需将查询更改为:DATE_FORMAT(CREATED_AT, '%Y-%m')。如果您想坚持 30 天并在执行查询之日开始计算这 30 天,这将不起作用。还有,@karmakaze;我不知道您为什么建议使用 SUM() 函数,但我认为 VALUE 值只是一个随机 id。通过将这些加起来,它并没有说明当月/ 30 天庆祝生日的人数。
  • 我相信在过去 30 天的部分中,我可以添加“where created_at > [30 days ago]”。 Sum 是我正在寻找的函数。
  • SUM 的使用:问题中的示例具有 VALUES 10、-7 和 12,应在结果中显示为 15。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2023-03-11
  • 2019-05-13
  • 2021-02-03
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多