Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定MYSQL中是否存在记录重复?_Mysql_Sql_Group By_Sum - Fatal编程技术网

如何确定MYSQL中是否存在记录重复?

如何确定MYSQL中是否存在记录重复?,mysql,sql,group-by,sum,Mysql,Sql,Group By,Sum,我正在运行一个查询,以找出工厂车间估计完成了多少工作,与工作站可用的小时数相比,实际跟踪了多少时间 我这样做是为了确定我们需要购买更多的机器。任何使用率超过100%的机器都是我们的产能过剩 问题是,我在一些操作中得到了天文数字,5个人在一台机器上工作不可能超过120小时,但我得到的结果远远超过了1000小时 我在查询中所做的是获取所有具有任务的批,并将每个任务的所有估计时间相加。我将批日志中经过的所有时间相加,并将打开的小时数乘以该操作的机器数 正因为如此,去毛刺最多应该有120个小时,因为它们

我正在运行一个查询,以找出工厂车间估计完成了多少工作,与工作站可用的小时数相比,实际跟踪了多少时间

我这样做是为了确定我们需要购买更多的机器。任何使用率超过100%的机器都是我们的产能过剩

问题是,我在一些操作中得到了天文数字,5个人在一台机器上工作不可能超过120小时,但我得到的结果远远超过了1000小时

我在查询中所做的是获取所有具有任务的批,并将每个任务的所有估计时间相加。我将批日志中经过的所有时间相加,并将打开的小时数乘以该操作的机器数

正因为如此,去毛刺最多应该有120个小时,因为它们每天24小时开放,有5个去毛刺站。当查看此查询时,是否有任何引人注目的地方跳出来

如果你需要更多信息,请告诉我

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