mysql - 如何获取从开始时间到结束时间所有正在运行的作业的总和?

标签 mysql sql apache-pinot

我有一张包含数百万条记录的表:

enter image description here

我想获取从开始时间结束时间的所有正在运行的作业的总和。例如查询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

结果:

<表类=“s-表”> <标题> 工作 作业计数 <正文> 作业1、作业2、作业7 3

或者,您可以使用 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

结果:

<表类=“s-表”> <标题> 工作 作业计数 <正文> 作业1、作业2、作业7 3

db<> fiddle here .

注释:

  • 我使用了虚拟值 1对于分组,这就是为什么我使用 subqueryCTE ,如果您不介意输出该列,您可以删除 subqueryCTE .

  • 您可以添加 DISTINCTORDER 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/

相关文章:

PHP多下拉框表单提交至MySQL

php - 为什么只有数字字段插入到我的表中?

php - 在 php mysql 应用程序中处理关注用户功能

php - 从一个字段设置数据库中的多个字段

python - 使用 Python 将数据从 REST API 导入到 SQL DB 的更好方法?

php - 从 PHP 查询中调用 getter 方法

java - 无法将 java.sql.Date 插入数据库中的 "Date"字段