Muschelpuster
Benutzer
- Beiträge
- 22
Moin zusammen,
ich bilde für die in meiner Datenbank eintreffenden Datensätze mit Messwerten in Form von Zeiträumen über Trigger Schnellsummen, da die gewünschte Auswertung aller Datensätze in einem Zeitraum bei größeren Datenmengen zu lange dauerten. Dank der Unterstützung hier funktioniert das einwandfrei, aber jetzt bin ich wieder an einem Punkt wo ich nicht weiter komme.
Hier mal eine Beispielhafte Konfig:
So kann ich jetzt aus den Schnellsummen sehr schnell auch längere Datenreihen lesen und visualisieren. Doch ich kann keine Datenreihe lesen, die z.B. eine Summe von den Messpunkten P1 und P2 abbildet. Wenn ich einfach sage, WHERE messpunkt = 'P1' or messpunkt = 'P2' bekomme ich ja eine völlig falsche Kurve.
Ich müsste also z.B. alle Werte von P1 im gewünschten Zeitraum lesen und dazu immer den direkt vor der gelesenen Zeit liegenden Wert von P2 addieren. Die Werte bekomme ich mit SQL gelesen, aber beim Addieren wird es wohl eng und folgenden Gedanken kann man wohl nicht abbilden, oder?
Also bliebe es ja den Trigger zu erweitern und eine neue Schnellsumme zu bilden:
Aber wenn ich das richtig sehe, bekomme ich da auch den festen Text nicht rein.
Hat da noch jemand eine Idee, wie ich auch diese Hürde nehmen kann?
Niels
ich bilde für die in meiner Datenbank eintreffenden Datensätze mit Messwerten in Form von Zeiträumen über Trigger Schnellsummen, da die gewünschte Auswertung aller Datensätze in einem Zeitraum bei größeren Datenmengen zu lange dauerten. Dank der Unterstützung hier funktioniert das einwandfrei, aber jetzt bin ich wieder an einem Punkt wo ich nicht weiter komme.
Hier mal eine Beispielhafte Konfig:
Code:
CREATE TABLE `daten` (
`d_start` bigint(20) NOT NULL,
`d_ende` bigint(20) NOT NULL,
`d_messpunkt` varchar(20) COLLATE utf8mb4_german2_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;
ALTER TABLE `daten`
ADD PRIMARY KEY (`d_start`,`d_ende`,`d_messpunkt`);
INSERT INTO `daten` (`d_start`, `d_ende`, `d_messpunkt`) VALUES
(11, 20, 'P2'),
(18, 40, 'P1'),
(19, 31, 'P2'),
(20, 30, 'P1'),
(22, 40, 'P1')
(20, 49, 'P3');
CREATE TABLE `schnellsummen` (
`s_zeit` bigint(20) NOT NULL,
`s_zaehler` int(11) NOT NULL,
`s_messpunkt` varchar(20) COLLATE utf8mb4_german2_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;
ALTER TABLE `schnellsummen`
ADD PRIMARY KEY (`s_zeit`,`s_messpunkt`);
DELIMITER $$
CREATE TRIGGER `Schnellsummen` AFTER INSERT ON `daten`
FOR EACH ROW BEGIN
REPLACE INTO `messzeitpunkte` (`m_zeit`) VALUES (NEW.d_ende);
REPLACE INTO `messzeitpunkte` (`m_zeit`) VALUES (NEW.d_start);
REPLACE INTO schnellsummen SELECT d_start as Zeit, (SELECT COUNT(`d_messpunkt`) as Messpunkt FROM `daten` where `d_start` <= Zeit and `d_ende`> Zeit and `d_messpunkt` = NEW.d_messpunkt) AS Zaehler, d_messpunkt AS Messpunkt FROM `daten` WHERE d_start >= NEW.d_start AND d_start <= NEW.d_ende AND d_messpunkt = NEW.d_messpunkt;
REPLACE INTO schnellsummen SELECT d_ende as Zeit, (SELECT COUNT(`d_messpunkt`) as Messpunkt FROM `daten` where `d_start` <= Zeit and `d_ende`> Zeit and `d_messpunkt` = NEW.d_messpunkt) AS Zaehler, d_messpunkt AS Messpunkt FROM `daten` WHERE d_ende >= NEW.d_start AND d_ende <= NEW.d_ende AND d_messpunkt = NEW.d_messpunkt;
END$$
DELIMITER ;
Ich müsste also z.B. alle Werte von P1 im gewünschten Zeitraum lesen und dazu immer den direkt vor der gelesenen Zeit liegenden Wert von P2 addieren. Die Werte bekomme ich mit SQL gelesen, aber beim Addieren wird es wohl eng und folgenden Gedanken kann man wohl nicht abbilden, oder?
Code:
SELECT s_zeit AS Zeit, ((SELECT s_zaehler FROM schnellsummen WHERE s_zeit <= Zeit AND s_messpunkt = 'P1' ORDER BY s_zeit DESC limit = 1) + (SELECT s_zaehler FROM schnellsummen WHERE s_zeit <= Zeit AND s_messpunkt = 'P2' ORDER BY s_zeit DESC limit = 1)) FROM schnellsummen WHERE (s_messpunkt = 'P1' OR s_messpunkt = 'P2') AND (s_zeit >= 'Startzeit_Auswertung' OR s_zeit <= 'Endzeit_Auswertung');
Code:
REPLACE INTO schnellsummen SELECT d_start as Zeit, (SELECT COUNT(`d_messpunkt`) as Messpunkt FROM `daten` where `d_start` <= Zeit and `d_ende`> Zeit and (`d_messpunkt` = `P1` or `d_messpunkt` = `P2`)) AS Zaehler, "Festtext_für_P1&P2* FROM `daten` WHERE d_start >= NEW.d_start AND d_start <= NEW.d_ende AND (`d_messpunkt` = `P1` or `d_messpunkt` = `P2`);
Hat da noch jemand eine Idee, wie ich auch diese Hürde nehmen kann?
Niels