Tabellenfunktion nächst kleinerer Wert

Patrick2P

Benutzer
Beiträge
8
Hallo Zusammen,

ich habe eine Tabelle, die wie folgt aufgebaut ist:

ID;BereichID;Nutzerzahl,Preis

In dieser stehen folgende Beispielzahlen:

1;1;50;10
2;1;20;5
3;1;100;15
4;2;13;6
5;3;51;11
6;2;123;142
7;3;48;10
...

Ich möchte nun eine Tabellenwert Funktion, die mir für jede BereichID genau den einen Wert anzeigt, der dem Wert der Variable am nächsten kommt. Wenn ich der Variable also 50 als Wert gebe, sollte folgendes Ergebnis herauskommen:

1;1;50;10
4;2;13;6
7;3;48;10

Ich habe es mit folgendem Statement probiert:

SELECT BereichID, MIN(DISTINCT Nutzerzahl) AS Nutzer, Portpreis
FROM dbo.WP_dpcon_portkosten
GROUP BY BereichID, Portpreis
HAVING (MIN(DISTINCT Nutzerzahl) <= @AnzTN)

Dabei kommen aber alle Datensätze heraus die kleiner als die Variable sind. Also mehrere pro BereichID.

Was muss ich tun, dass ich nur den Wert pro Bereich bekommen, der am nächsten an der Variable ist?

Und zweite Frage: Hat jemand eien Idee für eine Funktion die den Datensatz zeigt, der am NÄCHSTEN zur Variable liegt. Wenn es also Datenszätze mit 10 und 60 Nutzer gibt, soll er bei V=50 die 60 ausgeben, nicht die 10.

Danke sehr im Voraus für die Hilfe.

Viele Grüße

Patrick
 
Werbung:
Dein Wunschergebniss paßt nicht zu Deinen Ausgangsdaten und der gestellten Aufgabe, richtig wäre:

Code:
test=*# select * from p2p ;
 id | b_id | anzahl | preis
----+------+--------+-------
  1 |    1 |     50 |    10
  2 |    1 |     20 |     5
  3 |    1 |    100 |    15
  4 |    2 |     13 |     6
  5 |    3 |     51 |    11
  6 |    2 |    123 |   142
  7 |    3 |     48 |    10
(7 rows)

test=*# with x as (select *, 50 <-> preis as abstand from p2p) select distinct on (b_id) * from x order by b_id, abstand;
 id | b_id | anzahl | preis | abstand
----+------+--------+-------+---------
  3 |    1 |    100 |    15 |      35
  4 |    2 |     13 |     6 |      44
  5 |    3 |     51 |    11 |      39
(3 rows)

test=*#

Vorsicht, das ist PostgreSQL, kannst Du aber vielleicht anpassen.
 
Zurück
Oben