Hi,
ich habe letzte Woche eine “Datenbank” bekommen, die eine nicht normalisierte Tabelle enthält und in etwa so ausschaut:
oid name value
1 name test0
2 wert 5
3 lastupdate 23.09.2012
4 name test2
5 wert 45
6 lastupdate 24.06.2012
Diese Tabelle wird leider täglich von einem Dienstleister geupdatet, d.h. die “values” ändern sich.
Über einen View versuche ich seit geraumer Zeit diese Tabelle zu normalisieren, vielleicht fällt euch eine Möglichkeit ein, wie ich das am besten bewerkstelligen könnte.
Schlecht. Definiere, wie das ‘normalisiert’ aussehen sollte. Es ist nicht klar, was wie zusammengehören soll. Man könnte vermuten, daß oid 1,2,3 und 4,5,6 zusammengehören könnten. Aber in der Welt von Datenbanken hantiert man mit Mengen von Datensätzen, zwischen denen es per se keine logischen Verbindungen gibt.
HI,
also ich hätte gerne statt der oben gegebenen Tabelle einen View der mir die tablle umbaut, so dass sie dann so ausschaut:
oid|name|wert|lastupdate
und du hast recht, es gehören name wert und lastUpdate immer zusammen. Diese DB raubt mir gerade den letzten Nerv. Danke für deine Unterstützung
Du könntest die OID durch 3 teilen und dir daraus mit modulo und abs eine eindeutige ‘Datensatz-ID’ konstruieren. Danach mit tablefunc daraus eine Pivottabelle konstruieren. Nur so als Anregung.
setzt aber voraus, daß dem auch so ist. Falls die Spalte OID heißt, dann dürfte das in der Tat die systemweite OID sein. Dann ist diese tausend prozentig NICHT dafür geeignet. Es sei denn, die DB hat nur diese eine Tabelle bzw. es gibt exakt keinerlei andere schreibende Zugriffe. Sehr unwahrscheinlich.
Im Beispiel oben heißt die so, klein geschrieben halt, hab ich beim korrigieren überlesen. Bin davon ausgegangen, das das eine normale ID mit blödem Namen ist.
Funktioniert natürlich nur, wenn die Werte nicht wild durcheinander stehen, sondern zumindest immer 3 zusammengehörige hintereinander kommen. Wenn das nicht so ist, wirds eh übel, wenn man keine Tabelle hat, die die zusammengehörigen ‘oids’ zusammenführt.
Genau. Möglicherweise ist dem Fragesteller nicht bekannt, was eine OID ist. Und auch wenn diese Spalte via eigener SERIAL gefüllt wird ist keinesfalls sicher, daß diese lückenfrei ist. Das ist ein ganz heißer Kandidat für schmackhaften Datensalat, wenn man sich da blind drauf verläßt …
Hi,
danke für den Input. Mit oids bin ich sehr gut vertraut-dadurch kostet mich der Spaß ja auch erst Nerven ohne Ende.
Ich hätte die Spalte hier ganz einfach weglassen sollen.
mfg
Balli
select *
from crosstab('select case when oid%3 = 0 then oid/3 -1 else abs(oid/3) end as id, name, value from demo',
'select name from demo group by name') as (id text, wert text, name text, lastupdate text)
Wenn man ‘oid’ klein schreibt, scheint das wohl kein Problem zu sein. Trotzdem wäre ein anderer Name besser. Um den Salat mit den Lücken zu umgehen müsste man mit einer Windowfunktion eine fortlaufende ID erzeugen anstatt der oid, das dürft jetzt aber ihr machen