2011-10-28 14 views
4

私は、工場の床でどれくらいの作業が行われたか、ステーションが利用可能な時間と比較して実際にどれくらいの時間が追跡されたかを調べるクエリを実行しています。MYSQLでレコードの重複が発生しているかどうかを確認するにはどうすればよいですか?

私は、「これは、我々は100%以上の使用率を持っている。何の多くを購入する必要がどのマシンかを決定するためにやっMは、我々は、容量を介しているものです。

問題は、私が「ということですある機械で働く5人の男性が120時間以上を追跡することは不可能だが、私が得ている結果は千以上である。

私がクエリで行うことはtakeすべてのバッチはタスクを持っており、各タスクの推定時間を合計します。私はbatch_logでtime_elapsedを合計し、hours_openにそのオペレーションのマシン数を掛けます。

このため、デバッラーは24時間開いており、バリ取りステーションが5つあるため、最大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 

だから私は再び始めていると私は、このポイントに得れば、私は、経過時間に重複があるようだ:

select 
    batches.operation_id, 
    date(batch_log.start_time) as date, 
    SEC_TO_TIME(SUM(TIME_TO_SEC(batch_log.time_elapsed))) as elapsed, 
    sum(tasks.estimated_nonrecurring + tasks.estimated_recurring) as estimated_time 

from 
    batches 
INNER JOIN batch_log on batches.id = batch_log.batch_id 
INNER JOIN tasks on batches.id = tasks.batch_id 
WHERE batches.id not in (
-1, 
-2, 
-3, 
-4, 
-5, 
-6, 
-7, 
-8, 
-9, 
-10, 
-11, 
-12, 
-13, 
-14 
) 
group by Date(batch_log.start_time), operation_id 
order by batch_log.start_time, batches.operation_id 

編集:私は上記で間違って何をやっているの?私がこれを知っていれば、クエリをよりよく構造化するように注意することができます。正直なところ、私は何も見つけることができず、私はSQLブックを掘り下げてきました。私が小さな声明で答えを得ることができたとしても、私はいくらか進歩を遂げることができました。今は他のものに取り組んでいます。

+1

多分あなたは、1日で24時間以上働くことができる素晴らしい人を雇ったことがあります。仕事は「記録」と定義することができます。 :) –

+1

本当に、あなたは一日のために単一のマシンのレコードを見てみましたか、正気は数字をチェックしましたか? –

+1

あなたは '機械'に 'INNER JOIN 'していますが、決してそれを使用することはありません(サブクエリを通してのみ)。あなたのテーブルデザインとサンプルデータを知らなくても、それが実際の問題かどうかは分かりません。それを削除すると、パフォーマンスが向上する可能性があります... Gah、これの一部は、CTEでロールアップするのがずっとうれしいでしょう。 –

答えて

1

明確化してください...

明らかにバッチごとに複数のレコードをバッチログします。
バッチテーブル、別個のバッチ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秒 を経過してきているんです。そのアグリゲーションを1つの修飾された バッチに事前にグループ化することで、バッチIDによるバッチとタスクへの簡単な結合を行うことができます。 ベーシスが1つのバッチIDであるため、ダブルカウントを気にすることなくタスクからSUM()を実行できます。バッチIDによってグループすべてこれは集計のあるもののために、

次に操作と機械のテーブルに参加 次のレベルを簡素化し、私は 事前に集約されているものはそう、彼らはそれぞれ単一のレコードを返すと減少します デカルトCOUNT()およびSUM()問題の可能性。

マシンに関して。 操作に関連付けられているマシンがありますが、操作と日付でグループ化しています。それは と言われています。そして、それは操作が交差する日付( )を毎日担当することになります。それにより、 に歪んだ数字が表示されますか?わからない、遠くまで考えなかった。

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 
+0

バッチに複数のタスクを含めることはできますか?はい。 バッチで複数の操作を実行できますか? No. 操作ごとに異なるマシンの重要性は重要ですか? 私はそうは思わない、私がそれをやっている唯一の理由は、駅が開いている時間数を数え、マシンの数を掛けることができるということだ。 EG:Deburrは24時間開いています.25台のバリ取り機がありますので、24時間* 5台は20時間です。 ありがとうございます。 – davidahines

+0

@dah、元の質問にいくつかのサンプルデータを提供できれば、そのような回のロード、操作、タスクのバッチを表示することは素晴らしいでしょう。単一のバッチが複数のオペレーションにまたがる場合、バッチ/バッチのロードがオペレーションに固有でない場合は、重複した時間が得られます...たとえサンプルデータが真の関係を示していて、 。 – DRapp

+0

単一バッチは操作にまたがることはできません。 – davidahines

4

マシンへの参加はありますが、それを使用することはなく、マシンカウントを取得するためのサブクエリがあります。これらは両方とも照会に含まれるべきではありません。

このように、あなたは、あなたがジョインを削除するか、マシンカウントを削除し、選択したマシンを使用して、マシンによってグループをクエリに追加する必要があると思います。

+1

+1スナップ! ....... –

4

メインクエリのマシンに参加している場合、hours_openと推定の合計値はです。すでにには、各操作に含まれるマシンの数が膨らんでいます。

最も簡単な解決策は、リンクが保持され、マシンのカウントのサブクエリがcount(distinct m.id)に置き換えられた場合、クエリがおそらくより効率的になりますが、メインクエリのマシンに内部結合を削除することです。 hours_openとestimatedの合計値もcount(distinct m.id)で除算する必要があります。ただし、マシン数(total_hoursでは、サブクエリ値による乗算を削除する必要があります)で膨らみたい場合を除きます。

+1

+1スナップバック! :) – Briguy37

+0

これを試して、まだ重複を持っているようだ、私はクエリを編集しました。 – davidahines

1

その推測のビットが、それはあなたがあなたのマシンの数によってhours_elapsed掛けることになります意味し、操作ごとに複数のマシンを持っているように見えます。..

私があなただったら、私は思いますグループとグループを削除してください。生の日差しが残っているはずです。重複があれば簡単に見つけることができます。

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 

EDIT:

これはあなたに(未テスト)より賢明な何かを与えるのか?

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 

EDIT2:

これはあなたに(未テスト)より賢明な何かを与えるのか?

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 
+0

うん、私は実際には、操作ごとのマシンの数を掛けることを考えている。あたかもペイントステーション1台につき8時間利用可能なように、2台のペイントマシンがある場合は16時間必要です。 – davidahines

+0

YEですが、サブクエリ内のマシン数を乗算してから、再びジョインにすることでもう一度。 – StevieG

+0

ああ! hours_elapsedは、私が何倍にしたいのではなく、利用可能な時間だけです。私はgetcha。私はあなたの質問をしよう。 – davidahines

6

通常、私は一度に1つのチャンクを開始し、データをチェックするので、私は何を期待するべきかを知っています。

開発するには、まずSELECT *を使用して始めてから、まず自分の結合を試してください。大規模なデータセットの場合は、どこのクラスでフィルタを設定して、レコードセットを1つだけ選択するか、ケース内のバッチを選択することができます。それから私はatimeでrawデータの1つのテーブルに戻り、結果を確認することができます。

私が誤ってレコードの数を大きくしすぎていないことがわかったら、私は自分が望む本当の列に追加を開始します。式の代わりに、実際の列を選択します。これは私が正確に数式を開発するのに役立ちます。私は数式と必要なグループ分けを追加します。

PS。マシンがisseを引き起こしていることは間違いありませんが、今後の問題を把握するためのツールを提供したいと思います。

+1

私に魚を教える+1。 – davidahines

関連する問題