MYSQL-дегі жазбаларды қайталауды қалайсыз ба?

Мен зауыттық қабатта қаншалықты бағаланған жұмыс жүргізілгенін және сол станцияның бар сағаттардың көлеміне қарағанда шынымен қанша уақыт қадағаланғанын білу үшін сұрауды жүргізіп жатырмын.

Мен қай машиналарды сатып алуымыз керек екенін анықтау үшін мұны жасаймын. 100% -дан астам пайдалану коэффициенті бар нәрсе - біз қуаттылыққа толы нәрсе.

Мәселе мынада, кейбір операциялар үшін астроникалық жоғары сандарды аламын. Машинада жұмыс істейтін 5 адамның 120 сағаттан астамын қадағалай алмайтыны мүмкін, алайда нәтиже мыңдағандан асады.

Сұрауымда жасаған ісім тапсырмалар бар барлық тапсырмаларды қабылдайды және әрбір тапсырманың барлық есептелген уақытын қамтиды. Batch_log-та барлық уақытты қосып, сағатты көбейтіп, осы операциялардың машиналар санымен көбейтемін.

Осыған байланысты дебурр 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, көзі
machines ішіне INNER JOIN болып табылады, бірақ оны ешқашан пайдаланбаңыз (ішкі сұрау арқылы ғана). Кесте дизайнын білместен және кейбір үлгі деректерін білмей, бұл мәселе нақты ма екенін білу қиын. Оны жою өнімділікті арттыруы мүмкін ... Га, кейбіреулері КОТ-мен бірге жұмыс істеуге әлдеқайда жақсы болар еді.
қосылды автор Clockwork-Muse, көзі
Бәлкім, сіз осындай ғажайып адамдарды жалдағансыз, олар күніне 24 сағаттан астам жұмыс істей алады. Мұнда жұмыс «жазба» ретінде анықталуы мүмкін. :)
қосылды автор Nathan Feger, көзі
Шынында да, бір күнде бір компьютердің жазбаларын қарап, сандарды тексеріп көрдіңіз бе?
қосылды автор Nathan Feger, көзі
Бұл лауазымға қарамастан, бұл сый-сияпатқа қарамастан, азайып бара жатыр. Сізге дерекқор схемасы туралы айтқан жоқсыз. дәл кестелеріңіздің құрылымын және оларға қойылған шектеулерді көрсетпейінше, сұрауды қалай түзете аламыз?
қосылды автор rsj, көзі

5 жауаптар

Әдетте мен осындай күрделі бір нәрсе жасауды қалағанда, мен бір уақытта бір қапшықты бастаймын және деректерді тексеремін, сондықтан мен не күтетінімді білемін.

Сондықтан, SELECT * функциясын қолданудан бастаймын және алдымен біріктірулерімді жасаймын. Егер ол үлкен деректер жиынтығы болса, онда сіз тек қана бір жиынтығын таңдап алуыңыз керек. Содан кейін шебер деректерге бір кестені атимен оралуға және нәтижелерімді тексеруге болады.

Мен кездейсоқ жазбалардың санын тым үлкен жасамағанымды білетінімнен кейін, қалаған нақты бағандарға қосылуға кірісемін. Формулалар емес, формулалардағы нақты бағандарды таңдап аламын. Бұл формулаларды нақты түрде әзірлеуге көмектеседі. Содан кейін формулалар мен кез келген қажетті топтаманы қосамын.

PS. Менің ойымша, машиналардың бұлшық етуге құқығы бар деп ойлаймын, бірақ болашақ проблемаларды анықтау үшін сіздерге бірқатар құралдарды бергім келді.

6
қосылды
+1 мені балыққа үйрету үшін.
қосылды автор davidahines, көзі

Негізгі сұраудағы машиналарға қосылғаныңызды ескере отырып, сағаттардың жалпы ұзақтығы мен есептелген мәндері әр операциядағы тартылған машиналардың саны бойынша (көбейтілген) қазірдің өзінде болып табылады.

Ең қарапайым шешім - бұл негізгі сұраудағы машиналарға ішкі қосылысты жою, алайда, егер сілтемені сақтап қалсаңыз, сұраудың тиімді болуы ықтимал, ал count (distinct m.id)/code>. Сағат саны мен бағалаудың жиынтық мәндері сонымен қатар, машиналар санымен шамадан тыс қалатын жағдайларды қоспағанда, count (әр түрлі m.id) бойынша бөлу керек (total_hours, онда суб-сұралған мәнге көбейту жою керек).

4
қосылды
Бұл әрекетті қайталау қайталанатын сияқты, мен сұранысты өңдеймін.
қосылды автор davidahines, көзі
+1 Snapback! :)
қосылды автор Briguy37, көзі

Сізде машиналарға қосылуға болады, бірақ оны ешқашан пайдаланбаңыз және сізде машина сандарын алу үшін қосалқы сұрау болады. Олар сұрауда екеуі де болмауы керек.

Мәселен, менің ойымша, сіз біріктіруді алып тастауыңыз керек немесе машиналар сандарын алып тастау керек, машиналарды таңдауыңызға қосылыңыз және машинаңызға сұранысыңызға топтар қосыңыз.

4
қосылды
+1 Snap! .......
қосылды автор Mark Bannister, көзі

Түсініктемелер өтінеміз ...

Әр партияға бірнеше рет жазылған Batch_Log Пакеттік кесте, нақты партия идентификаторы.

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-ден кешіктірмей аяқталады Сіздің сұрауыңызға сәйкес. Бұл біріктіру алдын ала топтастырылған жалғыз білікті топтамалар, содан кейін топтық идентификаторлар бойынша топтар мен тапсырмаларға қарапайым қосылуды жасай аламын. Сум() тапсырмаларды іске қосу ретінде екі рет санау туралы алаңдамай аламын негізі - бірыңғай пакеттік ID. Осының барлығын топтық идентификатор арқылы топтастырыңыз Операциялар мен машиналар кестесіне қосылудың келесі деңгейі

Содан кейін, агрегаттарға арналған, мен алдын-ала жинақталған осылайша олар бір реттік жазбаны қайтарады және азайтады Cartesian COUNT() және SUM() мәселелерінің мүмкіндіктері.

Машиналарға қатысты. Сізде машиналармен байланысты операция, бірақ кейін сіз операция мен күні бойынша топталады. Бұл және айтылғандай, бұл CAN (және жасайды) операциясын көрсетеді, бір машина күн сайын есептелетін болады. Бұл кейбіреулерге себеп бола ма? ықтимал қиғаш сандар ??? Әрине, бұл алыс емес деп ойлаған жоқ.

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: Deburr тәулік бойы жұмыс істейді, бес қоқыс шығару машинасы бар, сондықтан 24 сағат * бес машина маған 20 сағат беруі керек. Көмектесуге рақмет.
қосылды автор davidahines, көзі

Оны біраз болжауға болады, бірақ сізде әр операцияға бірнеше машина бар сияқты көрінеді, яғни машиналар санын сағат саны көбейтеді.

Егер сіз болсам, мен сізді шикізат күнімен бірге қалдыруға болатын агрегацияларды және топты алып тастаймын және кез келген қайталануды табу оңай болуы керек.

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, көзі
Ahh! Уақыттың сағаттары - бұл маған көбейткіш емес, жай ғана сағат. Мен аламын. Мен сіздің сұрағыңызды көремін.
қосылды автор davidahines, көзі
Иә, мен шын мәнінде операцияға арналған машиналар санына көбейтуге тырысамын. Біздің бояу станциясымызда 8 сағат бар секілді және бізде екі бояу машинасы бар, онда бізде 16 сағат болуы керек.
қосылды автор davidahines, көзі
YE, бірақ сіз өзіңіздің ішкі сұранысыңыздағы машиналар санына көбейтесіз, содан кейін тағы да біріктіру арқылы.
қосылды автор StevieG, көзі
сіз біршама нақты бола аласыз ба?
қосылды автор StevieG, көзі
Мен тағы да екі рет өзгерістер жасадым.
қосылды автор StevieG, көзі