Як я магу вызначыць, калі я атрымліваю запіс дублявання ў MYSQL?

Я бягу запыт, каб даведацца, колькі ацэньваецца праца была зроблена на заводзе падлогу і колькі часу было на самай справе адсочваецца ў параўнанні з колькасцю гадзін, што станцыя мае ў сваім распараджэнні.

Я "раблю гэта, каб вызначыць, якія машыны мы павінны купіць больш. Што-небудзь, што мы маем каэфіцыент выкарыстання больш чым на 100% з'яўляецца тое, што мы над ёмістасцю.

Праблема ў тым, што я атрымліваю астранамічна высокія лічбы для некаторых аперацый. Гэта немагчыма, што 5 мужчын, якія працуюць кожны на машыне можа адсочваць больш за 120 гадзін, аднак вынік я атрымліваю добра больш за тысячу.

Што я магу зрабіць у запыце прыняць усе партыі, якія маюць задачы і сума ўсіх разліковы час кожнай задачы. Я прасумаваць усе з time_elapsed ў batch_log і я памнажаць hours_open па колькасці машын гэтай аперацыі.

З-за гэтага, задзірыны павінны мець максімум 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

Так што я пачаў зноў, і як толькі я дабяруся да гэтага моманту я, здаецца, дубліраванне ў мінулы час:

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

EDIT: Што я раблю няправільна ў вышэй? Калі б я ведаў, што гэта я мог бы быць асцярожным, каб структураваць запыты лепш. Шчыра кажучы, я не змог знайсці што-небудзь, і я капацца ў кнігах SQL. Нават калі б я мог атрымаць адказ на меншым заяве я мог бы зрабіць некаторыя поспехі. Працуючы над іншымі рэчамі цяпер.

4
Ці буду я скінуць сваю інфармацыю з базы дадзеных? Або апісаць табліцы?
дададзена аўтар davidahines, крыніца
Вы <я> з'яўляюцца INNER JOIN ІНГАЎ машыны , хоць вы ніколі не выкарыстоўваць яго (толькі калі-небудзь праз подзапросов). Не ведаючы ваш дызайн табліцы і некаторыя ўзоры дадзеных, гэта трохі цяжка зразумець, калі гэта фактычны пытанне, хоць. Выдаленне будзе, верагодна, павялічыць прадукцыйнасць ... Гах, некаторыя з гэтага было б нашмат лепш звярнуць з КТР.
дададзена аўтар Clockwork-Muse, крыніца
Можа быць, вы толькі што нанялі такія дзіўныя людзі, яны здольныя працаваць больш за 24 гадзін у суткі. Там, дзе праца можа быць вызначана як "запіс". :)
дададзена аўтар Nathan Feger, крыніца
Сапраўды, хоць, вы спрабавалі проста гледзячы на ​​запісу адной машыны на працягу дня і здаровае праверыў нумары?
дададзена аўтар Nathan Feger, крыніца
Там прычына гэтае паведамленне стамляецца, нягледзячы на ​​шчодрасць. Вы не сказалі нам схему базы дадзеных. Як мы можам адладзіць свой запыт да таго часу, пакуль <я> дакладна вызначыць структуру табліц і накладаюцца на іх абмежаванні?
дададзена аўтар rsj, крыніца

5 адказы

Звычайна, калі я хачу зрабіць нешта складанае, як гэта я пачынаю адзін кавалак за адзін раз і праверыць дадзеныя, так што я ведаю, што я павінен чакаць.

Такім чынам, каб развіваць Пачну з дапамогай SELECT * і працаваць мой далучаецца да першай. Калі гэта вялікі набор дадзеных, я магу фільтраваць а, дзе clasue выбраць толькі адзін набор запісаў, партыя ў вашым выпадку. ТАДЫ я магу вярнуцца да неапрацаваным дадзеных адной табліцы Atime і праверыць мае вынікі.

Пасля таго, як я ведаю, што я не выпадкова зрабіў лік запісаў занадта вялікім, то я пачынаю дадаваць у рэальных слупках, якія я хачу. Замест формул, я выбіраю фактычныя слупкі, якія будуць у формулах. Гэта дапамагае мне дакладна распрацоўваць формулы. ТАДЫ Я дадаю ў формулах і любой неабходнай групоўкі.

PS. Я падазраю, што яны маюць рацыю, што машыны выклікаюць ISSE, але я хацеў бы даць вам набор інструментаў для высвятлення праблем у будучыні.

6
дададзена
+1 за навучанне мне рыбу.
дададзена аўтар davidahines, крыніца

Улічваючы, што вы далучайцеся да машын у асноўным запыце, падсумоўвацца значэння hours_open і ацэньваецца ў ужо раздзімаецца (памнажаецца) на колькасць машын, якія ўдзельнічаюць у кожнай аперацыі.

Самае простае рашэнне было б выдаліць ўнутранае злучэнне да машын у асноўным запыце, хоць запыт, верагодна, будзе больш эфектыўным, калі спасылка была захавана і подзапросов для падліку машын замененай COUNT (выразным m.id) . Сумуецца значэння hours_open і ацэньваецца таксама павінны быць падзеленыя на COUNT (выразным m.id) , за выключэннем таго, дзе вы хочаце, каб яны завышаныя па колькасці машын (у total_hours, дзе множанне на суб-запытанай кошту павінны быць выдалены).

4
дададзена
Спроба гэта, здаецца, усё яшчэ ёсць дубляванне, я рэдагаваў запыт.
дададзена аўтар davidahines, крыніца
+1 Snapback! :)
дададзена аўтар Briguy37, крыніца

У вас ёсць далучыцца да машын, але ніколі не выкарыстоўваць яго, і ў вас ёсць суб-запыт, каб падлічыць колькасць машын. Яны не павінны быць абодва ў запыце.

Такім чынам, я думаю, ваша праблема ў тым, што вам неабходна альбо выдаліць злучэнне, або выдаліць лічыльнік машыны, выкарыстоўваць машыны ўключаюцца ў вашым выбары, і дадаць групу на машынах да вашаму запыту.

4
дададзена
+1 Snap! .......
дададзена аўтар Mark Bannister, крыніца

Тлумачэнні, калі ласка ...

Відавочна Batch_Log некалькі запісаў у пакеце.
Пакетная табліца, выдатная партыя 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?

Тым не менш, вось мой агляд сітуацыі ... Па-першае, я атрымліваюць толькі час партыі бярвення прайшло менш 08:00:00 згодна з вашым запыце. Пры гэтым агрэгацыі папярэдне згрупаваны ў адзіны кваліфікаваны партыі, я магу затым зрабіць просты далучыцца да партыі і задачам па гэтых ідэнтыфікатарам партый. Я магу SUM() з задач, не клапоцячыся аб падвойным падліку ў якасці пачатковага Асновай з'яўляецца адной партыі ID. Гурт усё гэта з дапамогай пакетнага 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
1
дададзена
@Dah, не ведаю, калі вы нават спрабавалі пры ўмове, што запыт, але гэта павінна быць добра, як група, не паўплывала б на ваш каментар навескі 1: 1 аперацый
дададзена аўтар DRapp, крыніца
@dah, калі вы маглі б даць некаторыя ўзоры дадзеных у арыгінальным пытанні было б выдатна, паказваючы некаторыя такія часы партыя нагрузкі, работы, задачы. Калі адна партыя можа ахопліваць некалькі аперацый, то вы атрымаеце дубляваны час, калі партыя/партыі нагрузка не з'яўляецца спецыфічным для аперацыі ... Нават калі выбарачныя дадзеныя, якія паказваюць сапраўдныя адносіны і дзе расшчапляецца можа пайсці і не пайсьці б дапамагчы ,
дададзена аўтар DRapp, крыніца
Порцыі маюць operation_id.
дададзена аўтар davidahines, крыніца
Адна партыя не можа ахопліваць аперацыі.
дададзена аўтар davidahines, крыніца
Ці можа партыя некалькі задач? Так. Ці можа партыя некалькі аперацый? Не. Ці з'яўляецца значэнне асобных машын у эксплуатацыі крытычна? Я не думаю, адзіная прычына, я раблю гэта так, што я магу разлічваць колькасць гадзін, што станцыя адкрыта і памножыць на колькасць машын. EG: задзірыны адкрыты на працягу 24 гадзін, ёсць пяці задзірын машын так 24 гадзіны * пяці машыны павінны даць мне 20 гадзін. Дзякуй за дапамогу.
дададзена аўтар davidahines, крыніца

Яго крыху здагадкі, але, падобна, у вас ёсць некалькі машын у эксплуатацыю, што азначае, што вы будзеце памножыўшы 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
1
дададзена
Падобна на тое, яшчэ некаторы дубляванне. Можа быць, бліжэй, хоць.
дададзена аўтар davidahines, крыніца
Я рэдагаваў мае дадзеныя, што любы больш карысным?
дададзена аўтар davidahines, крыніца
Цяпер total_hours здаецца дублявацца.
дададзена аўтар davidahines, крыніца
Ааа! У hours_elapsed не тое, што я хачу, памножаныя, толькі гадзіны даступныя. Я стукай. Паспрабую ваш запыт.
дададзена аўтар davidahines, крыніца
Так, я на самой справе хачу памножыць на колькасці машын у эксплуатацыю. Як быццам у нас ёсць 8 гадзін, даступных на лакафарбавай станцыі і ў нас ёсць дзве фарбы машыны, то мы павінны мець 16 гадзін.
дададзена аўтар davidahines, крыніца
Так, але вы множання на колькасць машын у вашым подзапросов, а затым зноў за кошт таго, далучыцца, а ..
дададзена аўтар StevieG, крыніца
Вы можаце быць трохі больш канкрэтна?
дададзена аўтар StevieG, крыніца
Я зрабіў яшчэ некалькі змен, каб паспрабаваць разабрацца ў time_elapsed, які быў таксама падмануць ..
дададзена аўтар StevieG, крыніца