如何确定MYSQL中是否存在记录重复?
我正在运行一个查询,以找出工厂车间估计完成了多少工作,与工作站可用的小时数相比,实际跟踪了多少时间 我这样做是为了确定我们需要购买更多的机器。任何使用率超过100%的机器都是我们的产能过剩 问题是,我在一些操作中得到了天文数字,5个人在一台机器上工作不可能超过120小时,但我得到的结果远远超过了1000小时 我在查询中所做的是获取所有具有任务的批,并将每个任务的所有估计时间相加。我将批日志中经过的所有时间相加,并将打开的小时数乘以该操作的机器数 正因为如此,去毛刺最多应该有120个小时,因为它们每天24小时开放,有5个去毛刺站。当查看此查询时,是否有任何引人注目的地方跳出来 如果你需要更多信息,请告诉我如何确定MYSQL中是否存在记录重复?,mysql,sql,group-by,sum,Mysql,Sql,Group By,Sum,我正在运行一个查询,以找出工厂车间估计完成了多少工作,与工作站可用的小时数相比,实际跟踪了多少时间 我这样做是为了确定我们需要购买更多的机器。任何使用率超过100%的机器都是我们的产能过剩 问题是,我在一些操作中得到了天文数字,5个人在一台机器上工作不可能超过120小时,但我得到的结果远远超过了1000小时 我在查询中所做的是获取所有具有任务的批,并将每个任务的所有估计时间相加。我将批日志中经过的所有时间相加,并将打开的小时数乘以该操作的机器数 正因为如此,去毛刺最多应该有120个小时,因为它们
SELECT
DATE(bl.start_time) as date_tracked,
o.name as operation,
SUM(TIME_TO_SEC(bl.time_elapsed)/ 3600) as time_elapsed,
SUM(t.estimated_nonrecurring + t.estimated_recurring) / 3600 as estimated,
o.hours_open as hours_open,
(count(distinct m.id)) as machine_count,
hours_open * (count(distinct m.id)) as total_hours,
(sum(TIME_TO_SEC(bl.time_elapsed)) / 3600) / (count(distinct m.id)) as time_elapsed_usage
FROM
batches b
INNER JOIN
tasks t on b.id = t.batch_id
INNER JOIN
batch_log bl on b.id = bl.batch_id
INNER JOIN
operations o on b.operation_id = o.id
INNER JOIN
machines m on b.operation_id = m.operation_id
WHERE
bl.time_elapsed < "8:00:00"
GROUP BY
b.operation_id,
DATE(bl.start_time)
ORDER BY date_tracked, o.id
编辑:我在上面做错了什么?如果我知道这一点,我可以小心地更好地构造查询。老实说,我什么也找不到,我一直在翻阅SQL书籍。即使我可以从较小的语句中得到答案,我也可以取得一些进展。目前正在处理其他问题。你可以加入机器,但是永远不要使用它,并且您有一个子查询来检索机器计数。这些不应该都在查询中
因此,我认为您的问题在于您需要删除联接,或者删除机器计数,在选择中使用机器联接,并在查询中添加一组机器。如果您在主查询中加入机器,则打开的小时数和估计的小时数之和已经被夸大(乘以)根据每次操作涉及的机器数量
最简单的解决方案是在主查询中删除与机器的内部连接,尽管如果保留链接,并将机器计数的子查询替换为
count(distinct m.id)
,则查询可能会更有效。打开和估计的小时数总和也应除以count(不同的m.id)
,除非您希望通过机器数量(在总小时数中,通过子查询值的乘法应该被删除)来增加它们。这有点猜测,但看起来每个操作都有多台机器,这意味着您将用经过的小时数乘以机器数量
如果我是你的话,我会删除聚合和分组,这会给你留下原始数据,任何重复都会很容易发现
SELECT
DATE(bl.start_time) as date_tracked,
o.name as operation,
bl.time_elapsed / 3600 as time_elapsed,
t.estimated_nonrecurring + t.estimated_recurring / 3600 as estimated,
o.hours_open as hours_open,
(select COUNT(id) from machines where operation_id=o.id) as machine_count,
hours_open * (select COUNT(id) from machines where operation_id=o.id) as total_hours,
(bl.time_elapsed / 3600) / (select COUNT(id) from machines where operation_id=o.id) as time_elapsed_usage
FROM
batches b
INNER JOIN
tasks t on b.id = t.batch_id
INNER JOIN
batch_log bl on b.id = bl.batch_id
INNER JOIN
operations o on b.operation_id = o.id
ORDER BY date_tracked, o.id
编辑:
这会给你带来更明智的(未经测试的)东西吗
选择
日期(bl.开始时间)作为跟踪的日期,
o、 名称为操作,
总时间(从时间到秒(bl.TIME_已用)/3600)为已用时间,
总和(估计的非经常性+估计的经常性)/3600,
总小时数(o.hours\u open),
计数(不同的m.id)作为机器计数,
(总和(时间到秒(bl.TIME)经过)/3600)/(计数(不同的m.id))作为时间经过的使用
从…起
b批
内连接
b.id上的任务t=t.batch\U id
内连接
b.id上的批处理日志bl=bl.batch\U id
内连接
b.operation_id=o.id上的操作o
内连接
b.operation\u id=m.operation\u id上的机器m
哪里
bl.经过的时间<“8:00:00”
分组
b、 行动编号,
日期(bl.开始时间)
按跟踪日期的订单,o.id
编辑2:
这会给你带来更明智的(未经测试的)东西吗
选择
日期(bl.开始时间)作为跟踪的日期,
o、 名称为操作,
时间到秒(bl.TIME过去)/3600作为时间过去,
总和(估计的非经常性+估计的经常性)/3600,
总小时数(o.hours\u open),
计数(不同的m.id)作为机器计数,
(时间到秒(bl.TIME\U EASED)/3600)/(计数(不同的m.id))作为使用时间
从…起
b批
内连接
b.id上的任务t=t.batch\U id
内连接
b.id上的批处理日志bl=bl.batch\U id
内连接
b.operation_id=o.id上的操作o
内连接
b.operation\u id=m.operation\u id上的机器m
哪里
bl.经过的时间<“8:00:00”
分组
b、 行动编号,
日期(bl.开始时间)
按跟踪日期的订单,o.id
通常当我想做像这样复杂的事情时,我会一次开始一个块,然后检查数据,这样我就知道我应该期望什么
因此,为了开发,我首先使用SELECT*并计算出我的联接。如果它是一个大型数据集,我可能会按where类别进行筛选,以仅选择一组记录,即您的情况下的一个批次。然后我可以一次返回一个表的原始数据并检查结果
一旦我知道我没有意外地使记录的数量过多,我就开始添加我想要的实际列。我选择公式中的实际列,而不是公式。这有助于我准确地开发公式。然后我添加公式和任何必要的分组
另外,我怀疑他们是对的,机器导致了isse,但我想给你一套工具,用于解决未来的问题。请澄清 很明显,每批记录多条记录。
批次表,不同的批次ID
Now, on to tasks, operations and machines.
Can a batch have multiple tasks?
Can a batch have multiple operations?
Is the importance of distinct machines per operation critical?
也就是说,这是我对你情况的回顾。。。
首先,我只得到批处理日志,时间少于8:00:00
根据您的查询。将聚合预分组为单个
然后,我可以通过这些批ID简单地连接到批和任务。
我可以从任务中求和(),而不用担心开始时重复计算
基础是单个批次ID。按批次ID对所有这些进行分组可简化
下一级连接到操作和机器表
然后,对于聚合的,我有预聚合
那些就是他们
SELECT
DATE(bl.start_time) as date_tracked,
o.name as operation,
SUM(TIME_TO_SEC(bl.time_elapsed)/ 3600) as time_elapsed,
SUM(t.estimated_nonrecurring + t.estimated_recurring) / 3600 as estimated,
SUM(o.hours_open) as total_hours,
count(distinct m.id) as machine_count,
(sum(TIME_TO_SEC(bl.time_elapsed)) / 3600) / (count(distinct m.id)) as time_elapsed_usage
FROM
batches b
INNER JOIN
tasks t on b.id = t.batch_id
INNER JOIN
batch_log bl on b.id = bl.batch_id
INNER JOIN
operations o on b.operation_id = o.id
INNER JOIN
machines m on b.operation_id = m.operation_id
WHERE
bl.time_elapsed < "8:00:00"
GROUP BY
b.operation_id,
DATE(bl.start_time)
ORDER BY date_tracked, o.id
SELECT
DATE(bl.start_time) as date_tracked,
o.name as operation,
TIME_TO_SEC(bl.time_elapsed)/ 3600 as time_elapsed,
SUM(t.estimated_nonrecurring + t.estimated_recurring) / 3600 as estimated,
SUM(o.hours_open) as total_hours,
count(distinct m.id) as machine_count,
(TIME_TO_SEC(bl.time_elapsed) / 3600) / (count(distinct m.id)) as time_elapsed_usage
FROM
batches b
INNER JOIN
tasks t on b.id = t.batch_id
INNER JOIN
batch_log bl on b.id = bl.batch_id
INNER JOIN
operations o on b.operation_id = o.id
INNER JOIN
machines m on b.operation_id = m.operation_id
WHERE
bl.time_elapsed < "8:00:00"
GROUP BY
b.operation_id,
DATE(bl.start_time)
ORDER BY date_tracked, o.id
Now, on to tasks, operations and machines.
Can a batch have multiple tasks?
Can a batch have multiple operations?
Is the importance of distinct machines per operation critical?
SELECT STRAIGHT_JOIN
SmryByBatch.Operation_ID,
SmryByBatch.Date_Tracked,
SUM( SmryByBatch.Time_Elapsed ) Time_ElapsedByOpDate,
SUM( SmryByBatch.Time_Elapsed ) / OpMachines.Machine_Count Time_ElapsedPerMachine,
SUM( SmryByBatch.TaskEstByBatch ) TaskEstByOpDate,
o.Name Operation,
o.hours_open,
OpMachines.Machine_Count,
o.Hours_Open * OpMachines.Machine_Count as Total_Hours
FROM
( SELECT
b.Operation_ID,
PreQuery.Batch_ID,
PreQuery.Date_Tracked,
PreQuery.TotalTimeElapsed / 3600 as Time_Elapsed,
SUM( t.estimated_nonrecurring
+ t.estimated_recurring ) / 3600 as TaskEstByBatch
FROM
( SELECT
bl.batch_id,
DATE( bl.Start_Time ) date_tracked,
SUM( bl.time_elapsed ) TotalTimeElapsed
FROM
batch_log bl
WHERE
bl.time_elapsed < "8:00:00"
GROUP BY
bl.batch_ID,
DATE( bl.Start_Time ) ) PreQuery
JOIN batches b
ON PreQuery.Batch_ID = b.ID
JOIN Tasks t
ON PreQuery.Batch_ID = t.Batch_ID
GROUP BY
b.Operation_ID,
PreQuery.Batch_ID ) SmryByBatch
JOIN Operations o
ON SmryByBatch.Operation_ID = o.ID
JOIN ( select m.Operation_ID,
COUNT(distinct m.id) machine_count
from
machines m
group by
m.Operation_ID ) OpMachines
ON o.ID = OpMachines.Operation_ID
GROUP BY
SmryByBatch.Date_Tracked
SmryByBatch.Operation_ID,
ORDER BY
SmryByBatch.Date_Tracked,
SmryByBatch.Operation_ID