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

enter image description here

我想得到从Start TimeEnd Time的所有正在运行的作业(job)的总和.例如,查询1: 在1:00到4:00之间有多少作业(job)在运行? 那么这里的答案将是3(作业(job)1、作业(job)2和作业(job)7).

我可以使用联接,但我想要一种处理数百万条记录所需时间最少的方法.

推荐答案

你可以写一个subquery,在你的startend次之间得到你的job COUNT,同时写一个GROUP_CONCAT,把你的所有jobs分组到一个逗号分隔的行中:

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

Result:个个

Jobs Job Count
Job1, Job2, Job7 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

Result:个个

Jobs Job Count
Job1, Job2, Job7 3

DB<;&>小提琴here.

Notes:

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

  • 您可以向GROUP_CONCAT添加DISTINCTORDER BY属性,但这可能会影响您的性能.

GROUP_CONCAT(DISTINCT job ORDER BY job ASC SEPARATOR ', ')
  • 因为您要处理的数据集很大,所以我会确保您的表是正确的indexed.我不确定您的键列是什么,但设置indexes将加快查询速度.请参见How MySQL Uses Indexes.

Mysql相关问答推荐

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

根据SQL中的平均范围对学生进行排名

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

无法确定查询逻辑

最终的自联表是如何记住关联的呢?

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

Mysql 查询返回未定义的 node.js

基于多个 where 子句在规范化表中查找公共 ID(值)

MySQL函数 - 如何对select查询应用多个条件

使用索引进行查询优化

多个 FULLTEXT 索引上的 MySQL SELECT.结果极其缓慢

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

谁能帮我优化where子句

查找同时玩过这两种游戏的玩家

更改整数时间到日期格式 MM/DD/YY,如 python 中的 datetime.fromtimestamp

sql sum - 处理连接表中的脏重复项

终止空闲的mysql连接

MySQL使用多列 Select 重复记录

如何删除没有临时表的 MySQL 表中的所有重复记录

从 MySQL JSON 数据类型中提取不带引号的值