按日期获取表的所有先前记录 MySQL

时间:2020-12-26 12:27:37

标签: mysql sql datetime aggregate-functions

我的表目前有 21000 条记录,每天更新,插入了近 300 条记录。现在,我想要的是有一个查询来获取我的表在前 10 天内的元素计数,因此它返回:

<块引用>

26000

<块引用>

21300

<块引用>

21000

现在,我写了这个:

00 01 FFFFFFE2 40

它返回 21000 但只返回 1 天。我想通过查询按 10 天返回记录。

但是,这仅执行 1 天。 编辑:数据库风格是mysql,日期列是日期而不是日期时间

3 个答案:

答案 0 :(得分:1)

最有效的方法可能是聚合和累积总和:

select date(task_start_time) as dte, count(*) as cnt_on_day,
       sum(count(*)) over (order by date(task_start_time)) as running_cnt
from tbl_task
group by dte
order by dte desc
limit 10;

这将返回最近 10 天的数据。如果您愿意,您可以轻松适应更多天数——实际上是所有天数——没有太多麻烦。

答案 1 :(得分:0)

您可以使用 UNION ALL 和日期算术。

SELECT count(*)
       FROM tbl_task
       WHERE task_start_time < current_date
UNION ALL
SELECT count(*)
       FROM tbl_task
       WHERE task_start_time < date_sub(current_date, INTERVAL 1 DAY)
...
UNION ALL
SELECT count(*)
       FROM tbl_task
       WHERE task_start_time < date_sub(current_date, INTERVAL 9 DAY);

编辑:

您还可以加入一个派生表,该表使用 FROM-less SELECTUNION ALL 来获取回顾和聚合的天数。这可能更容易动态构建。 (但我怀疑它可能会更慢。)

SELECT count(*)
       FROM (SELECT 0 x
             UNION ALL
             SELECT 1
             ...
             UNION ALL
             SELECT 9)
            INNER JOIN tbl_task t
                       ON t.task_start_time < date_sub(current_date, INTERVAL x.x DAY)
       GROUP BY x.x;

在 MySQL 8+ 版本中,您甚至可以使用递归 CTE 来构造带有日期的表。

WITH RECURSIVE x
AS
(
SELECT 0 x
UNION ALL
SELECT x + 1
       FROM x
       WHERE x + 1 < 10
)
SELECT count(*)
       FROM x
            INNER JOIN tbl_task t
                       ON t.task_start_time < date_sub(current_date, INTERVAL x.x DAY)
       GROUP BY x.x;

答案 2 :(得分:0)

我不知道我是否错了,但你能不能简单地添加一个 GROUP BY - 语句?喜欢:

"SELECT COUNT(*) from tbl_task where `task_start_time` < '2020-12-01' GROUP 
BY task_start_time"

编辑: 这应该只适用于 task_start_time 是日期,而不是日期时间

编辑2: 如果是日期时间,您可以使用日期函数:

SELECT COUNT(*) from tbl_task where `task_start_time` < '2020-12-01' GROUP 
BY DATE(task_start_time)