Ergebnisse nummerieren

Hy,

ich würde gerne folgendes machen:

Ich lasse mir ergebnisse ausgeben, zum Beispiel eine Tabelle mit Namen.

Hans 1987
Hans 1998
Hans 2007
Christian 1987
Christian 2006

So und da sind noch mehr namen drinn

jetzt will ich durchzählen, welcher Hans der Erste auf der Welt war und welcher der zweite…

also das dann da stünde
Hans 1987 1
Hans 1998 2
Hans 2007 3
Christian 1987 1
Christian 2006 2

Gibt es da eine Funktion in SQL ? oder wie stelle ich das an?

Hab gelesen, dass man das irgendwie mit ner Funktion machen könnte.

Zähle alle wo Jahr <= Jahr vom Eintrag und Name = Name

Wie würde das in ner Funktion aussehen und vorallem der Aufruf dieser Funktion innerhalb eines normalen selects ?



Gruß BoOnOdY

Du kannst Dir dafür eine Sequence erzeugen und Dein Resultat mit mit nextval() von dieser Sequence versehen.

Angenommen, Du hast eine Table words mit der Spalte w, text. Davon alle Einträge, die mit a anfangen, sortiert und nummeriert.

test=*# create sequence foobar;
CREATE SEQUENCE
test=*# select nextval('foobar'), w from (select w from words where w ~ '^a' order by 1)bar;

Beachte, daß beim nächsten Aufruf die Sequence bereits einen Startwert hat. Als Verbesserung zu meinem Beispiel benutze eine temp. Sequence. Alternativ: schreib eine SRF.

Andreas


Andreas

Was ist denn eine SRF?

Würd das gerne sicher mit der Funktion machen, weiß nur nicht wie ich das angehen soll?
Von wegen Syntax

Count (*) from alter_namen
where name=new.name and alter<=new. alter


aber wie heißt in einer Funktion der Temporäre Wert der eingegeben wird?

wie siehts aus mit ein und ausgabe und so Späße.

Find da in der Doku meistens net besonders viel

Gruß BoOnOdY

Set Returning Function

Würd das gerne sicher mit der Funktion machen, weiß nur nicht wie ich das angehen soll?
Von wegen Syntax

Steht in der Doku. Beispiel:

test=# create table foo (name text);
CREATE TABLE
Time: 148.425 ms
test=*# insert into foo values ('magdalena');
INSERT 0 1
Time: 1.405 ms
test=*# insert into foo values ('katharina');
INSERT 0 1
Time: 0.954 ms
test=*# insert into foo values ('tamara');
INSERT 0 1
Time: 1.042 ms
test=*# commit;
COMMIT
test=# select * from foo order by 1;
   name
-----------
 katharina
 magdalena
 tamara
(3 rows)

Time: 1.515 ms
test=*# create or replace function get_foo(OUT _c int, out _name text) returns setof record as $$declare rec record; c int; begin c:=0; for rec in select name from foo order by 1 loop _c := c; c:=c+1;_name=rec.name; return next; end loop; end; $$ language plpgsql;
CREATE FUNCTION
Time: 130.938 ms
test=*# select * from get_foo();
 _c |   _name
----+-----------
  0 | katharina
  1 | magdalena
  2 | tamara
(3 rows)

Time: 46.875 ms
test=*#



Find da in der Doku meistens net besonders viel

Gruß BoOnOdY

Besser suchen.
out parameter sql & plpgsql examples - zillablog

Andreas

So dann kommt das bei mir:

ERROR: function result type must be integer because of OUT parameters

funktion dazu :

    create or replace function numerieren (text, float, out out_anzahl integer) returns setof record as $$
declare
foo record;
begin
for foo in select count(*) as anzahl from zuordnung where dialcode=$1 preis <= $2 loop
out_anzahl=foo.anzahl;
return next;
end loop;
return;
end; $$ language 'plpgsql'

Wie rufst Du das auf? Deine zwei WHERE-Bedingungen stehen so in einer falschen Syntax, vermutlich. So ganz allein ohne AND oder OR…

Wozu einklich das als Function?

Andreas

okay das and hab ich vergessen, tut aber nichts zur Sache bei dem Fehler.
Der kommt nämlich schon wenn ich die Funktion überhaupt createn möchte


Weil ich möchte bestimmte einträge durchnummerieren.

Zum beispiel hab ich 3 ma den artikel 105 und jetzt will ich die nach Preis durchnummerieren. Das ich mir dann sagen kann. Okay, wenns den Artikel 105 im Aldi nicht mehr gibt, hol ich ihn im Lidl, weil der der 2t billigste ist und wenns den auch da nemmer gibt dann im 3ten also im Penny … so zum beispiel.


hab aber keinen Plan was ich da falsch mache =(

Ja, Fallstrick. Du gibst nur ein Feld zurück, int. Deklarierst aber ‘setof record’. Tausche dort mal record gegen int.

Andreas

danke das klappt jetzt =)
aber wie bekomm ichs jetzt noch auf die Reihe das mit anderen Daten auszugeben?

Weil ich lasse mir ja von der funktion nur eine Zahl ausgeben und kann die ja nicht irgendwie Jointen oder so ? gibts da nen Trick bei funktionen?


Weil wenn ich sage Select Artikel, Supermarkt, Preis from Supermarkt_liste
order by Artikel, Preis

dann hab ich ja keine Parameter für die Funktion?
Oder kann ich eine Funktion auch mehr als einen Typen ausgeben lassen?
Weil dann würde ich die Werte einfach aus der anderen Tabelle durchschleifen

Was muss ich dann hinschreiben bei record bzw int ?

Mehrere Spalten? Ich zeigte doch in diesem Thread dazu ein Beispiel.

Weil ich lasse mir ja von der funktion nur eine Zahl ausgeben und kann die ja nicht irgendwie Jointen oder so ? gibts da nen Trick bei funktionen?

Depends.


Andreas

Sorry das ich mich so dumm anstelle, aber ich muss erst ma in Funktionen rein kommen.

okay die funktion da ist alles Tutti, bis auf, das sie das ergebnis des select befehls immer als 0 ausgibt ??

aber wie ruf ich die jetzt für jede Zeile korrekt auf?

Select * from numerieren(select name,ort,alter from namensliste)
wäre das was ich wollte, geht aber natürlich nicht

meine funktion

create or replace function 
numerieren(text,text,float, out name text, out ort text, OUT alter int, out counter int) 
returns setof record as 
$$declare rec record; 
begin
 for rec in select count(*) as anzahl from namensliste
where alter<=$3 and name=$1 loop 
counter := anzahl;
name := $1;
ort := $2;
alter := $3;
return next; 
end loop; 
end; 
$$ language plpgsql;

Aber tausend Dank schon mal