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

Posted

技术标签:

【中文标题】按日期获取表的所有先前记录 MySQL【英文标题】:Getting all previous records of table by date MySQL 【发布时间】:2021-04-03 23:18:05 【问题描述】:

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

26000

21300

21000

现在,我写了这个:

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

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

但是,这只会持续 1 天。 编辑:数据库风格是 mysql,日期列是日期而不是日期时间

【问题讨论】:

See if this helps '如果在不包含 GROUP BY 子句的语句中使用聚合函数,则相当于对所有行进行分组。' - dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html 编辑您的问题并指定您正在使用的数据库引擎类型,包括版本,以便人们可以给您一个准确的答案。 【参考方案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 天。如果您愿意,您可以轻松适应更多的日子——实际上是所有的日子——没有太多麻烦。

【讨论】:

谢谢。很抱歉打扰,但你能告诉我现在如何添加变量而不是硬代码 10。我知道这超出了这个问题的范围,但它的语法是什么 @SalmanAhmed 。 . . limit 的语法解释了可以传入的内容:dev.mysql.com/doc/refman/8.0/en/select.html。【参考方案2】:

您可以使用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 SELECTs 和UNION 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;

【讨论】:

但我想让它动态化,以便用户可以过滤天数 @SalmanAhmed:这不是你问的。请不要更改问题并使答案无效。 对不起,我忘了在问题中提及它,根据当前的问题要求,您的答案是正确的。我想我可以解决这个答案并使用循环使其动态但如果有更好的解决方案请告诉【参考方案3】:

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

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

编辑: 这应该只在 task_start_time 是一个日期时才有效,如果它是一个日期时间则不行

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

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

【讨论】:

它只返回该日期的记录,而不是我想要的是获取该日期之前存在于该表中的所有记录 好的,您能否编辑您的问题并添加您正在使用的数据库类型(mysql、mariadb...)以及 task_start_time 列的格式。它是日期还是日期时间? @SalmanAhmed 已编辑:日期是日期而不是日期时间,数据库是 mysql 谢谢,我认为@o-jones 已经提供了一个很好的例子。我会想出类似的东西。你应该考虑他的回答

以上是关于按日期获取表的所有先前记录 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 查询获取日期时间紧跟当前日期时间之后的记录

如何从包含日期时间列的表中获取某些行和“先前”行?

SQL 按日期排序并按用户获取结果

SQL 按日期分组,但也获取不带记录的日期

django 1.5 按日期获取最新记录

获取按日期排序的最后记录的最佳性能方法