我有一张包含数百万条记录的表:
我想获取从开始时间
到结束时间
的所有正在运行的作业的总和。例如查询1:
1:00 到 4:00 之间有多少个作业在运行?
那么这里的答案将是 3(Job1、Job2 和 Job7)。
我可以使用联接,但希望采用花费最少时间处理数百万条记录的方法。
最佳答案
你可以写一个subquery
这会得到你的工作 COUNT
在您的开始和结束时间之间以及 GROUP_CONCAT
将所有作业分组到一个逗号分隔的行中:
SELECT jobs AS "Jobs", job_count AS "Job Count"
FROM
(
SELECT
1,
GROUP_CONCAT(job SEPARATOR ', ') as jobs,
COUNT(job) AS job_count
FROM
sample_table
WHERE
start_time >= '1:00'
AND
end_time <= '4:00'
GROUP BY
1
) a
结果:
或者,您可以使用 CTE
:
WITH cte AS (SELECT
1,
GROUP_CONCAT(job SEPARATOR ', ') as jobs,
COUNT(job) AS job_count
FROM
sample_table
WHERE
start_time >= '1:00'
AND
end_time <= '4:00'
GROUP BY
1
) SELECT jobs AS "Jobs", job_count AS "Job Count" FROM cte
结果:
db<> fiddle here .
注释:
我使用了虚拟值
1
对于分组,这就是为什么我使用subquery
和CTE
,如果您不介意输出该列,您可以删除subquery
或CTE
.您可以添加
DISTINCT
和ORDER BY
属性GROUP_CONCAT
但这可能会影响您的表现。
GROUP_CONCAT(DISTINCT job ORDER BY job ASC SEPARATOR ', ')
- 由于您正在处理大型数据集,我会确保您的表正确
indexed
。我不确定你的关键列是什么,但设置indexes
会加快查询速度。请参阅How MySQL Uses Indexes .
关于mysql - 如何获取从开始时间到结束时间所有正在运行的作业的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73650959/