1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Tabellenfunktion nächst kleinerer Wert

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Patrick2P, 7 März 2019.

  1. Patrick2P

    Patrick2P Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden