Einzelne Messwerte in Auswertungstabelle zusammenfassen

Nomos

Benutzer
Beiträge
11
Moin,

ich habe hier eine Tabelle mit Messwerten (MySql) die wie folgt ausschaut:

Tabelle: Messwerte

Messort Messgerätnr Datum Messung
---------+---------------+--------------+------------
AZZ Z45678 01.01.2010 4556
AZZ Z45678 01.06.2010 4699
AZZ Z45678 01.09.2010 4745
AZZ Z45678 12.10.2010 4788
AZZ Y95492 12.10.2010 0
AZZ Y95492 01.01.2011 0245
AZZ Y95492 01.01.2012 0879
AYY Z54679 01.01.2010 1234
AYY Z54679 01.01.2011 1561
AYY Z54679 01.01.2012 2188

...

Ich würde diese Tabelle jetzt gerne in eine Tabelle der folgenden Struktur überführen:

Tabelle: Auswertung

Messort Messgerätnr DatumVon DatumBis Delta
---------+---------------+--------------+--------------+-------
AZZ Z45678 01.01.2010 01.06.2010 143
AZZ Z45678 01.06.2010 01.09.2010 46
AZZ Z45678 01.09.2010 12.10.2010 43
AZZ Y95492 12.10.2010 01.11.2011 245
AZZ Y95492 01.11.2011 01.12.2012 634
AYY Z54679 01.01.2010 01.01.2011 327
AYY Z54679 01.01.2011 01.01.2012 627


Hier in diesem Forum habe ich in den zurückliegenden Beiträgen nichts gefunden, was mich da
weiterbringen können. Vielleicht gibt es hier eine mitfühlende Seele, die sich meiner erbarmt. ;-)

Liebe Grüße
Nomos
 
Werbung:
Code:
test=*# select * from nomos ;
 messort |  nr  |  datum  | messung
---------+--------+------------+---------
 azz  | Z45678 | 2010-06-01 |  4699
 azz  | Z45678 | 2010-09-01 |  4745
 azz  | Z45678 | 2010-10-12 |  4788
 azz  | Y95492 | 2010-10-12 |  0
 azz  | Y95492 | 2011-01-01 |  245
 azz  | Y95492 | 2012-01-01 |  879
 ayy  | Z54679 | 2010-01-01 |  1234
 ayy  | Z54679 | 2011-01-01 |  1561
 ayy  | Z54679 | 2012-01-01 |  2188
 azz  | Z45678 | 2010-01-01 |  4556
(10 Zeilen)

test=*# select * from (select messort, nr, datum as "DatumVon", lead(datum) over (partition by messort,nr order by datum) as "DatumBis", lead(messung) over (partition by messort,nr order by datum) - messung as "Delta" from nomos order by messort desc,nr desc, datum) foo where "Delta" is not null;
 messort |  nr  |  DatumVon  |  DatumBis  | Delta
---------+--------+------------+------------+-------
 azz  | Z45678 | 2010-01-01 | 2010-06-01 |  143
 azz  | Z45678 | 2010-06-01 | 2010-09-01 |  46
 azz  | Z45678 | 2010-09-01 | 2010-10-12 |  43
 azz  | Y95492 | 2010-10-12 | 2011-01-01 |  245
 azz  | Y95492 | 2011-01-01 | 2012-01-01 |  634
 ayy  | Z54679 | 2010-01-01 | 2011-01-01 |  327
 ayy  | Z54679 | 2011-01-01 | 2012-01-01 |  627
(7 Zeilen)

test=*#

Du hast aber einige Probleme:

  • MySQL als Hauptproblem. Das kennt keine Window-Funktionen
  • offenbar falsche Datentypen. Deine Datums- und Messwerte scheinen TEXT zu sein.
 
Moin, AK:

Zu deinen Anmerkungen:

"MySQL als Hauptproblem. Das kennt keine Window-Funktionen"

Windows-Funktionen sind doch für meine Aufgabenstellung nicht erforderlich. Oder?

"offenbar falsche Datentypen. Deine Datums- und Messwerte scheinen TEXT zu sein."

In der realen Tabelle sind die Messwerte natürlich vom Typ Numerisch und das Erfassungsdatum vom Typ DATE. Dieses Beispiel habe ich "mal so eben" per Editor erstellt.

BTW: Der Editor im Forum ist nicht so 100%ig WYSIWYG. Er hat allem Anschein nach den Ehrgeiz, mehrere aufeinanderfolgende Leerzeichen etwas zu "optimieren".
 
Moin,

das war als Frage zu verstehen. Ich wollte damit nicht aussagen, dass ich es besser wüsste.

Noch einmal zu deiner Lösung - für die ich mich schon einmal bedanke.


Hier die Ausgangstabelle:

DROP TABLE IF EXISTS `MESSWERTE`;
CREATE TABLE IF NOT EXISTS `MESSWERTE`(
`Messort` VARCHAR(10) NOT NULL DEFAULT '',
`Messgerätnr` varchar(10) NOT NULL DEFAULT '',
`Datum` DATE NOT NULL DEFAULT 0,
`Messung` INTEGER NOT NULL DEFAULT 0
) CHARACTER SET UTF8 COMMENT='MESSWERTE';

INSERT INTO MESSWERTE VALUES ('AZZ', 'Z45678', '2010-01-01', 4556);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Z45678', '2010-06-01', 4699);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Z45678', '2010-09-01', 4745);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Z45678', '2010-10-12', 4788);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Y95492', '2010-10-12', 0);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Y95492', '2011-01-01', 245);
INSERT INTO MESSWERTE VALUES ('AZZ', 'Y95492', '2012-01-01', 879);
INSERT INTO MESSWERTE VALUES ('AYY', 'Z54679', '2010-01-01', 1234);
INSERT INTO MESSWERTE VALUES ('AYY', 'Z54679', '2011-01-01', 1561);
INSERT INTO MESSWERTE VALUES ('AYY', 'Z54679', '2012-01-01', 2188);


Wenn ich jetzt die von dir erstellte Abfrage anwende, gibt es eine Fehlermeldung.

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Partition by Antrnr, Zählernr order by Datum) as "DatumBis", lead(Von_Stand) o' at line 1

Vielleicht fällt dir beim Lesen ja dazu etwas auf. Für mich sind einige der verwendeten Abfrageelemente noch völlig neu. Ich brauche noch etwas Handbuchstudium, um das zu druchdringen.

Gruß
Nomos
 
Wenn ich jetzt die von dir erstellte Abfrage anwende, gibt es eine Fehlermeldung.

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(Partition by Antrnr, Zählernr order by Datum) as "DatumBis", lead(Von_Stand) o' at line 1

Vielleicht fällt dir beim Lesen ja dazu etwas auf. Für mich sind einige der verwendeten Abfrageelemente noch völlig neu. Ich brauche noch etwas Handbuchstudium, um das zu druchdringen.

Darf ich mich wiederholen? MySQL kann keine Window-Funktionen, und das sind welche, hier lead(...) over (...). Exakt das kann MySQL lediglich in Form einer Fehlermeldung. Aber ich kann Dir gerne mit Handbuchstudium helfen: PostgreSQL: Documentation: 10: 9.21. Window Functions
 
Ja, okay. Verstanden! Bis eben war ich davon ausgegangen, dass die von dir verwendeten Sprachelemente zur SQL-Syntax gehören.Dem ist aber allem Anschein nach nicht so. Na, fein! Man lernt eben nie aus.

Aber dennoch vielen Dank für deine kostbare Lebenszeit, die du in die Beantwortung meiner Frage investiert hast.

Gruß
Nomos
 
Moin, AK,

danke für deine detaillierte Antwort. IOW: wenn ich das Gelesene richtig verstehe, bin ich als Benutzer von Open-Source also für die nächsten Jahre also erst einmal außen vor.

Die Anschaffung eine der kommerziellen DBMS kommt für meine Zwecke leider nicht in Frage.

Liebe Grüße
Nomos
 
Moin, akretschmer,
moin, Walter.

Danke für eure Beiträge. Daraufhin also schaue ich mich flugs einmal auf www.postgresql.org um und lese dort:

Latest Releases
2018-03-01 - PostgreSQL 10.3 Released! The PostgreSQL Global Development Group has released an update to all supported versions of our database system, including 10.3, 9.6.8, 9.5.12, 9.4.17, and 9.3.22.

  • 10.3 · 2018-03-01 · Notes
  • 9.6.8 · 2018-03-01 · Notes
  • 9.5.12 · 2018-03-01 · Notes
  • 9.4.17 · 2018-03-01 · Notes
  • 9.3.22 · 2018-03-01 · Notes
Die soeben erschienene Version 8 kann jetzt auch Window-Funktionen.

Das ist etwas irritierend für mich. Woher resultieren diese unterschiedlichen Versionstände? (Version 8 vs. 10.3)

Einen inspirierenden Dienstag
wünscht Nomos
 
Ich spreche von PostgreSQL. Aktuelle Versionen zwischen 9.3.x und 10.x mit x = den entsprechenden Bugfix-Versionen. Walter meinte MySQL.
 
Werbung:
Moin, Walter.

Die soeben erschienene Version 8 kann jetzt auch Window-Funktionen.

Die Aussage kann ich bestätigen. Das SQL-Statement von AK wird jetzt ausgegeführt. Ich habe lediglich die Feldbezeichnungen und den Tabellennamen angepasst:

Code:
select * from (select messort, Messgerätnr, datum as "DatumVon", lead(datum) over (partition by messort, Messgerätnr order by datum) as "DatumBis", lead(messung) over (partition by messort, Messgerätnr order by datum) - messung as "Delta" from Messwerte order by messort desc, Messgerätnr desc, datum) foo where "Delta" is not null;

Ansonsten ist das Erscheinen der Version 8 von MySQL ja fast wie in Grimms Märchen. Heißt es anfangs noch, MySQL verfüge nicht über Windows-Funktionen, kommt sogleich die gute Fee, die alles wendet. ;-)

@AK

Im Gegensatz zu der von dir geposteten Ergebnistabelle werden bei mir auch Zeilen angezeigt, die Delta=NULL aufweisen. Das von dir in das Statement eingefügte 'where "Delta" is not null' sollte anscheinend gerade das verhindern.
  • Ist das jetzt ein Ergebnis der unterschiedlichen DBMS?
  • oder wurde die Ergebnistabelle von dir etwas beautified?
  • oder ist meine angepasste Version fehlerhaft?

Code:
messort,   Messgerätnr,   DatumVon,   DatumBis,   Delta
AZZ,     Z45678,       2010-01-01,   2010-06-01,   143
AZZ,     Z45678,       2010-06-01,   2010-09-01,   46
AZZ,     Z45678,       2010-09-01,   2010-10-12,   43
AZZ,     Z45678,       2010-10-12,   NULL,     NULL
AZZ,     Y95492,       2010-10-12,   2011-01-01,   245
AZZ,     Y95492,       2011-01-01,   2012-01-01,   634
AZZ,     Y95492,       2012-01-01,   NULL,     NULL
AYY,     Z54679,       2010-01-01,   2011-01-01,   327
AYY,     Z54679,       2011-01-01,   2012-01-01,   627
AYY,     Z54679,       2012-01-01,   NULL,     NULL

Grüße an alle
von Nomos
 
Zurück
Oben