Kompliziertes löschen von Doppelten Einträgen

Hy,

Also Folgende Inputtabelle ist da :

Artikelnummer, Supermarkt, Preis

1567, Aldi, 10,00
15671, Aldi, 10,00
15577, Aldi, 2,00
2311, Lidl, 10,00
15577,Lidl, 1,50
1567,Lidl, 12,00

So Folgende Abfragen will ich machen:

Gebe mir ein Ranking aus:
1567,Aldi, 10,00,1
1567,Lidl, 12,00,2
15577,Lidl, 1,50,1
15577,Aldi, 2,00,2
2311, Lidl, 10,00,1
15671, Aldi, 10,00,1

Dazu ist der Thread schon entstanden:
http://www.pg-forum.de/sql/1594-ergebnisse-nummerieren.html#post8057

Die Andere Abfrage soll sein:
Zeige mir nur die Billigsten an
UND (jetzt kommt der schwierige Teil)
Wenn die Preise gleich sind und die Artikelnummer~~(Artikelnummer||’%’::text)
dann gebe mir nur den Eintrag mit der kürzesten Artikelnummer aus.

1567,Aldi, 10,00
15577,Lidl, 1,50
2311, Lidl, 10,00

und dann will ich noch einen Skript ausführen und dann
sollen auf diese Preise 5% aufgeschlagen werden und in eine starre Tabelle geschrieben werden.

Und ich komm da im Mom nicht mehr weiter, könnte mir vielleicht bitte jemand ein bisschen unter die Arme greifen udn mich auf den richtigen Weg stoßen?

Hab noch nicht so die Übersicht über die Möglichkeiten von PostgreSQL, vielleicht hat das ja extra schon wege dafür, die ich nur nicht kenne.

Gruß BoOnOdY



test=*# select * from artikel ;
  nr   | markt | preis
-------+-------+-------
 1567  | Aldi  | 10.00
 15671 | Aldi  | 10.00
 15577 | Aldi  |  2.00
 2311  | Lidl  | 10.00
 15577 | Lidl  |  1.50
 1567  | Lidl  | 12.00
(6 rows)

create or replace function ranking(OUT _nr int, OUT _markt text, OUT _preis numeric(10,2), OUT _ranking int)
declare
        ranking int;
        _old_nr text;
        rec     record;
begin
        _old_nr := '';
        ranking := 1;
        for rec in select nr, markt, preis from artikel group by nr, markt, preis order by nr, preis loop
                if _old_nr <> rec.nr then
                        ranking := 1;
                else
                        ranking := ranking + 1;
                end if;
                _old_nr := rec.nr;
                _nr := rec.nr;
                _markt := rec.markt;
                _preis := rec.preis;
                _ranking := ranking;
                return next;
        end loop;
end;
$$ language 'plpgsql';

test=*# select * from ranking();
  _nr  | _markt | _preis | _ranking
-------+--------+--------+----------
 15577 | Lidl   |   1.50 |        1
 15577 | Aldi   |   2.00 |        2
  1567 | Aldi   |  10.00 |        1
  1567 | Lidl   |  12.00 |        2
 15671 | Aldi   |  10.00 |        1
  2311 | Lidl   |  10.00 |        1
(6 rows)

Für das andere hab ich grad keine Zeit, aber das schaffst Du bestimmt selber…

Andreas

Hy,

also schon mal tausend Dank für alles =)

ich hab mich mal drann gemacht seh aber meinen Fehler nicht.

Wenn ich das ganz vereinfache also nur den “neu” rec in SQL abfrage macht der genau was ich will. Wenn ich aber den gleichen Befehl in die funtion kopiere gibt sie kein Ergebnis mehr aus.

Hier mal die ausführliche Version.

create or replace function doppelte_weg(OUT _artikelnummer text, OUT _supermarkt text, OUT _preis float) returns setof record
as 
$$
declare
        rec    record;
        neu     record;
begin
       
        for rec in 
            select artikelnummer, supermarkt, preis 
            from guppiert 
            group by artikelnummer, supermarkt, preis  
            order by supermarkt,artikelnummer, preis
loop
     
        for neu in     select artikelnummer, preis, supermarkt 
            from guppiert 
            where  preis=rec.preis and artikelnummer ~~(rec.artikelnummer||'%'::text) 
            order by char_length(artikelnummer)
            limit 1 
loop

        _artikelnummer     :=neu.artikelnummer;
    _supermarkt      :=neu.supermarkt;
    _preis        :=neu.preis;
end loop;
end loop;
end;
$$ language 'plpgsql';

Schnellschuß: Dir fehlt ein ‘return next;’.

Andreas

Dankeschön =) jetzt klappt alles wie es soll =)