我的表目前有 21000 条记录,每天更新,插入了近 300 条记录。现在,我想要的是有一个查询来获取我的表在前 10 天内的元素计数,因此它返回:
<块引用>26000
<块引用>21300
<块引用>21000
等
现在,我写了这个:
00 01 FFFFFFE2 40
它返回 21000 但只返回 1 天。我想通过查询按 10 天返回记录。
但是,这仅执行 1 天。 编辑:数据库风格是mysql,日期列是日期而不是日期时间
答案 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 SELECT
和 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;
答案 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)