zu einer article_id gibt es mehrere key/value Paare.
Ich möchte das ganze in folgender Form ausgeben:
article_id, key, value, key, value , …
wobei die key/value Tupel entspechend der spalte sort sortiert sind.
Ich habe eine einfache Aggregatfunktion erstellt, welche die key/value Paare in ein Array schreibt, dieses wird dann am Ende wieder in einen String umwandelt, aber sobald ich die sort Spalte mit in das select einbaue, muss es auch im group by stehen und dann habe ich immer nur ein Tupel im Array.
hat jemand eine Idee , wie man das hinbekommt?
rolf
article_id, key, value, key, value , …
wobei die key/value Tupel entspechend der spalte sort sortiert sind.
Wieviel kommt nach dem … ?
Schaut nach einer wilden Kreutztabelle aus.
Ich habe eine einfache Aggregatfunktion erstellt, welche die key/value Paare in ein Array schreibt, dieses wird dann am Ende wieder in einen String umwandelt, aber sobald ich die sort Spalte mit in das select einbaue, muss es auch im group by stehen und dann habe ich immer nur ein Tupel im Array.
hat jemand eine Idee , wie man das hinbekommt?
rolf
nicht wirklich.
Zeig mal ein Beispiel für die Daten und wie das Result aussehen soll. Mit plpgsql kann man viel machen…
SELECT article_id,
array_to_string(keys, ', ')
FROM (
SELECT article_id,
array_agg(key||'='||value) OVER (PARTITION BY article_id ORDER BY sort) as keys,
row_number() OVER (PARTITION BY article_id ORDER BY sort DESC) as row_number
FROM articles
) t
WHERE row_number = 1
Theoretisch kann es beliebig viele dieser key/value Tupel geben,
allerdings sind es immer gleich viele.
Nein nein, es gibt zu einen Artikel (refernziert durch den Fk article_id) eine Reihe von Merkmalen, die über key/value Tupel spezifiziert werden. Die sort Spalte dient dazu, die Reienfolge im GUI zu bestimmen.
das ist nicht so einfach, da im wirklichen Fall noch ein paar Tabellen mehr involviert sind. Dann habe ich in der Doku nichts darüber gefunden, wie genau eine eigene sfunc in create aggreate aufgebaut sein muss, speziell was den Rückgabewert betrifft.
Ich versuche mal, das auf das Kernproblem zu reduzieren.
Rolf
Ahh, Junge, das passt, das ist aber schon heftig in die Trickkiste gegriffen, so spontan fällt einem das nicht ein! Ich musste es noch etwas ändern damit es mit meinen Tabellen passt, aber das Ergebnis sieht gut aus. Jetzt muss ich noch die halbe Nacht Doku lesen um zu verstehen, warum das funktioniert …
SELECT id,
val,
val + lag(val,1,0) over (order by id) as summe_mit_vorher,
val + lag(val,1,0) + over (order by id) + lead(val, 1, 0) over (order by id) as summe_vorher_und_nachher
FROM bla;
lag() greift auf die “vorherige” row zu. Der erste parameter definiert die Spalte aus der Zeile. Der zweite parameter definiert wie weit man zurückgehen will (2 bedeutet 2 Zeilen zurück usw), der dritte Parameter der default wert, falls es diese Zeile nicht gibt (bei der ersten gibt es ja keinen Vorgänger.
Erste/Vorherige usw. bezieht sich auf die Sortierung die in over() angegeben wurde.
Mit negativen Werten für den zweiten Parameter geht man “vorwärts”. Aber dafür kann man auch die lead() Funktion verwenden.
Na gott sei dank habe ich gestern die 8.4 version testweise installiert, jetzt kann ich mal dran gehen, diese neuen Features zu erkunden. Bisher dachte ich immer über “na ja, das habe ich bisher auch noch nie gebraucht”, aber das scheinen doch ganz mächtige neue Funktionen zu sein.