MySQL - 获取最近 1 天、7 天、30 天的聚合,并允许将记录计入超过 1 组

标签 mysql sql

我有一个包含以下数据的表:

enter image description here

我希望将行分组为以下几行:

  • 在最后一天内(过去 24 小时内的所有内容)
  • 在过去 7 天内(上周内的所有内容)
  • 过去 30 天内(过去一个月内的所有内容)

上述行的最终结果类似于:

enter image description here

我现在可以将记录分组到这些括号中:

SELECT (CASE WHEN created_at = CURDATE() THEN '1 Day'
             WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
             WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN '30 Days'
        END) AS Timeframe, COUNT(*) AS Count
FROM my_table
GROUP BY (CASE WHEN created_at = CURDATE() THEN '1 Day'
               WHEN created_at >= CURDATE() - INTERVAL 6 DAY THEN '7 Days'
               WHEN created_at >= CURDATE() - INTERVAL 29 DAY THEN'30 Days'
          END)

但是这样可以防止单个记录被多次统计。例如,第一张图片中的第 2 行和第 3 行需要计入所有三个括号(1 天、7 天和 30 天) - 而第 6 到 9 行只需要计入 30 天括号。

您将如何使用 MySQL 执行此操作?

最佳答案

以列而不是行的形式最容易做到这一点:

SELECT SUM(created_at = CURDATE()) as today
       SUM(created_at >= CURDATE() - INTERVAL 6 DAY) as last_7_days,
       SUM(created_at >= CURDATE() - INTERVAL 29 DAY) as last_30_days,
       SUM(created_at < CURDATE() - INTERVAL 29 DAY) as older
FROM my_table;

关于MySQL - 获取最近 1 天、7 天、30 天的聚合,并允许将记录计入超过 1 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290501/

相关文章:

mysql - 在 MySQL 查询中排除星期几中的时间

php - Mysql选择除第一行和最后一行以外的所有内容

php - 重写代码 - 不起作用

sql - 如何在 postgres 的 jsonb 列中找到最小值的键?

mysql - 通过在一个简单的表上使用 MySql 进行三次计数和分组......是否可以在一个查询中进行?

c# - 组合框值加载问题

php - php中的SQL语句不会插入数据库

mysql - SQL如何通过特定列将两个表连接在一起?

mysql - 加入联结表,如何?

SQLite 接受 SQL 语法中不存在的连接类型