Files
Samuele Locatelli 9fa4e2da64 Fix posizione stored
2024-05-02 19:53:39 +02:00

129 lines
4.9 KiB
SQL

DROP PROCEDURE IF EXISTS `stp_recalcDailyMGP`;
CREATE PROCEDURE `stp_recalcDailyMGP`(
IN `pDateStart` DATETIME,
IN `pDateEnd` DATETIME,
IN `pMachineId` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Ricalcolo statistiche giornaliere x MachGroup + Part da LogMachine'
BEGIN
# Elimino dati eventualmente presenti nel periodo indicato
DELETE
FROM PartList
WHERE (DtStart >= pDateStart AND DtStart < pDateEnd)
OR (DtEnd >= pDateStart AND DtEnd < pDateEnd);
DELETE
FROM MachGroupList
WHERE (DtStart >= pDateStart AND DtStart < pDateEnd)
OR (DtEnd >= pDateStart AND DtEnd < pDateEnd);
DELETE
FROM DayStat
WHERE DtRif>= pDateStart AND dtRif < pDateEnd;
# creo record MachGroup con inizio e fine
INSERT INTO MachGroupList(MachGroupId, ProjDbId, DtStart, DtEnd)
SELECT tab_s.MachGroupId, tab_s.ProjDbId, tab_s.DtStart, tab_e.DtEnd
FROM
(
SELECT *
,@rownum := IF(GroupKey = @prev_col1, @rownum + 1, 1) AS numriga
,@prev_col1 := GroupKey
FROM
(
SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-2),';',1) AS INT) AS MachGroupId
, SUBSTRING_INDEX(VarValue, ';',-2) AS GroupKey
, ProjDbId
, DtEvent AS DtStart
FROM LogMachine
WHERE MachineID = pMachineId
AND (DtEvent >= pDateStart AND DtEvent < pDateEnd)
AND EvType = 2
AND RIGHT(VarValue,1) = 1
) t , (SELECT @rownum := 0, @prev_col1 := NULL) r
ORDER BY GroupKey
) as tab_s
JOIN
(
SELECT *
,@rownum := IF(GroupKey = @prev_col1, @rownum + 1, 1) AS numriga
,@prev_col1 := GroupKey
FROM
(
SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-2),';',1) AS INT) AS MachGroupId
, SUBSTRING_INDEX(VarValue, ';',-2) AS GroupKey
, ProjDbId
, DtEvent AS DtEnd
FROM LogMachine
WHERE MachineID = pMachineId
AND (DtEvent >= pDateStart AND DtEvent < pDateEnd)
AND EvType = 2
AND RIGHT(VarValue,1) = 2
) t , (SELECT @rownum := 0, @prev_col1 := NULL) r
ORDER BY GroupKey
) AS tab_e
ON tab_s.MachGroupId = tab_e.MachGroupId AND tab_s.ProjDbId = tab_e.ProjDbId AND tab_s.numriga = tab_e.numriga;
# creo record Part con inizio e fine
INSERT INTO PartList(PartId, MachGroupId, ProjDbId, DtStart, DtEnd)
SELECT tab_s.Id, tab_s.MachGroupId, tab_s.ProjDbId, tab_s.DtStart, tab_e.DtEnd
FROM
(
SELECT *
,@rownum := IF(GroupKey = @prev_col1, @rownum + 1, 1) AS numriga
,@prev_col1 := GroupKey
FROM
(
SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-2),';',1) AS INT) AS Id
, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-3),';',1) AS INT) AS MachGroupId
, SUBSTRING_INDEX(VarValue, ';',-3) AS GroupKey
, ProjDbId
, DtEvent AS DtStart
FROM LogMachine
WHERE MachineID = pMachineId
AND (DtEvent >= pDateStart AND DtEvent < pDateEnd)
AND EvType = 1
AND RIGHT(VarValue,1) = 1
) t , (SELECT @rownum := 0, @prev_col1 := NULL) r
ORDER BY GroupKey
) as tab_s
JOIN
(
SELECT *
,@rownum := IF(GroupKey = @prev_col1, @rownum + 1, 1) AS numriga
,@prev_col1 := GroupKey
FROM
(
SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-2),';',1) AS INT) AS Id
, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VarValue, ';',-3),';',1) AS INT) AS MachGroupId
, SUBSTRING_INDEX(VarValue, ';',-3) AS GroupKey
, ProjDbId
, DtEvent AS DtEnd
FROM LogMachine
WHERE MachineID = pMachineId
AND (DtEvent >= pDateStart AND DtEvent < pDateEnd)
AND EvType = 1
AND RIGHT(VarValue,1) = 2
) t , (SELECT @rownum := 0, @prev_col1 := NULL) r
ORDER BY GroupKey
) AS tab_e
ON tab_s.id = tab_e.id AND tab_s.MachGroupId = tab_e.MachGroupId AND tab_s.ProjDbId = tab_e.ProjDbId AND tab_s.numriga = tab_e.numriga;
# per giancarlo: verificare la procedura che crei correttamente part e machGroup, controllando che le date siano coerenti (eventi inizio/fine sequenziali), lasciando eventualmente fuori i dati "incompleti"; verificare con EMmanuele se evento inizio da prendere sia "il primo o il precedente" considerato che POTREMMO avere + record inizio che fine
#SELECT *
#FROM MachGroupList;
#SELECT *
#FROM PartList;
END;