Normalisierung

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.

mit besten Grüßen
Balli

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

Genau. test0, 5 und 24.06.2012 oder test0, 45 und 23.09.2012, oder noch eine andere Kombination?

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.

Gruß Uwe

Nein, es gehören immer die aufeinander folgenden Werte zueinander.

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

Mal kurz gebaut:

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)

Ergebnis:

"0";"5";"test0";"23.09.2012"
"1";"45";"test2";"24.06.2012"

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 :wink:

Grüße Uwe

Großartig-das finde ich cool. Ich danke euch für eure Mühen. Mit besten Grüßen Balli