Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT WHERE nächst grösseren oder nächst kleineren Wert

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SELECT WHERE nächst grösseren oder nächst kleineren Wert

    Hallo Zusammen,

    Angenommen die Tabelle hat in einer Spalte folgende werte:
    10
    32
    23
    21
    30
    35
    55
    22
    40
    29
    13
    50
    21
    14
    15

    1.
    Nun wird die 30 selektiert und gleichzeitig soll die an die 30 am nächsten liegende Zahl selektiert werden. In diesen Fall wäre es die 29. Wie geht das?

    2.
    Es wird die 14 selektiert. Nun haben wir als nächsten Zahlen die 13 oder die 15 zur Auswahl. Hier soll (wenn vorhanden) die kleinere selektiert werden. Wie geht das?

    3.
    Es wird die 22 selektiert. Als nächste Auswahl stehen die 21 und 23 zur Verfügung. Da bei gleicher nähe immer für die kleinere Zahl entschieden wird, kommt die 21 zur Wahl. Die 21 gibt es aber 2x. Welche von beiden selektiert wird ist egal. Aber wie macht man das?

    Danke für eure Hilfe.

    Gruss S.


  • #2
    Zitat von santana2000 Beitrag anzeigen
    Nun wird die 30 selektiert und gleichzeitig soll die an die 30 am nächsten liegende Zahl selektiert werden. In diesen Fall wäre es die 29. Wie geht das?
    Umkreissuche?

    http://www.datenbankforum.com/thread...eissuche.1550/
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zitat von akretschmer Beitrag anzeigen
      Umkreissuche?
      nein..

      Kommentar


      • #4
        Order By und dann den Eintrag davor (falls vorhanden) ansonsten den dahinter. Oder denk ich jetzt zu einfach?

        Kommentar


        • #5
          Sowas wie
          PHP-Code:
          SELECT
              
          <whatever>
          FROM
              table1 t1
          INNER JOIN
              table1 t2 ON t2
          .value != t1.value
          WHERE
              t1
          .value 20 // = nenner
          ORDER BY
              ABS
          (t2.value t1.value)
          LIMIT 1 
          ?
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Zitat von santana2000 Beitrag anzeigen
            nein..
            Im Prinzip schon, nur nicht geographisch. Mach halt 2 Abfragen mit UNION, berechne die Differenz. Mit KNN geht es halt einfacher - kann MySQL aber nicht.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von rkr Beitrag anzeigen
              Sowas wie ?
              Danke, das kommt der Sache sehr nahe! Vielleicht mache immernoch etwas falsch.

              mein Test:
              PHP-Code:
              SELECT 
                  
              //.. habe es auch mit t1.spalte und t2.spalte getestet.
              FROM 
                  tabelle t1
              INNER JOIN 
                  tabelle t2 ON t2
              .spalte != t1.spalte
              WHERE 
                  t1
              .spalte 22 // = nenner
              ORDER BY 
                  ABS
              (t2.spalte t1.spalte)
              LIMIT 1

              //..ergebnis mit SELECT *
              spalte spalte
                22   
              |   21

              //..ergebnis mit SELECT t1.spalte
              spalte |
                
              22   |

              //..ergebnis mit SELECT t2.spalte
              spalte |
                
              23   
              Das Ergebnis soll aber sein "spalte 21".

              Habe noch folgendes getestet:
              PHP-Code:
              SELECT 
                  t1
              .spalte AS nennert2.spalte AS am_naehesten
              FROM 
                  tabelle t1
              INNER JOIN 
                  tabelle t2 ON t2
              .spalte != t1.spalte
              WHERE 
                  t1
              .spalte 22 // = nenner
              ORDER BY 
                  ABS
              (t2.spalte t1.spalte)
              LIMIT 1

              //..Ergebnis mit SELECT t1.spalte AS nenner, t2.spalte AS am_naehesten
              nenner am_naehesten 
                22   
              |      21 
              Ist das Zufall, oder funktioniert es wirklich so?

              Kommentar


              • #8
                Nein, da musst du dann irgendwo einen Fehler haben. Deine Grundannahme (zumindest so, wie ich sie verstehe) wirkt auf mich richtig.
                Standards - Best Practices - AwesomePHP - Guideline für WebApps

                Kommentar


                • #9
                  Zitat von santana2000 Beitrag anzeigen

                  1.
                  Nun wird die 30 selektiert und gleichzeitig soll die an die 30 am nächsten liegende Zahl selektiert werden. In diesen Fall wäre es die 29. Wie geht das?

                  2.
                  Es wird die 14 selektiert. Nun haben wir als nächsten Zahlen die 13 oder die 15 zur Auswahl. Hier soll (wenn vorhanden) die kleinere selektiert werden. Wie geht das?

                  3.
                  Es wird die 22 selektiert. Als nächste Auswahl stehen die 21 und 23 zur Verfügung. Da bei gleicher nähe immer für die kleinere Zahl entschieden wird, kommt die 21 zur Wahl. Die 21 gibt es aber 2x. Welche von beiden selektiert wird ist egal. Aber wie macht man das?

                  Danke für eure Hilfe.

                  Gruss S.
                  Mit Deinen Zahlen:

                  Code:
                  test=*# select * from santana ;
                   i
                  ----
                   10
                   32
                   23
                   21
                   30
                   35
                   55
                   22
                   40
                   29
                   13
                   50
                   21
                   14
                   15
                  (15 rows)
                  
                  test=*# select i from santana order by 30 <-> i;
                   i
                  ----
                   30
                   29
                   32
                   35
                   23
                   22
                   21
                   21
                   40
                   15
                   14
                   13
                   50
                   10
                   55
                  (15 rows)
                  
                  test=*# select i from santana order by 14 <-> i;
                   i
                  ----
                   14
                   13
                   15
                   10
                   21
                   21
                   22
                   23
                   29
                   30
                   32
                   35
                   40
                   50
                   55
                  (15 rows)
                  
                  test=*# select i from santana order by 22 <-> i;
                   i
                  ----
                   22
                   21
                   23
                   21
                   15
                   29
                   30
                   14
                   13
                   32
                   10
                   35
                   40
                   50
                   55
                  (15 rows)
                  Sollte das sein, was Du suchst. Explain dazu:

                  Code:
                  test=*# set enable_seqscan to off;
                  SET
                  test=*# explain select i from santana order by 22 <-> i;
                                                QUERY PLAN
                  ----------------------------------------------------------------------
                   Index Scan using idx_i on santana  (cost=0.13..8.43 rows=15 width=4)
                     Order By: (i <-> 22)
                  (2 rows)
                  (ich muß seq_scan ausschalten, weil die Tabelle zu klein ist)

                  Wie man aber sieht: ich mache eine Umkreissuche (das ist der <-> - Operator), und es wird ein Index genutzt, und ich brauche nur einen Lauf durch die Tabelle.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Edit: War Unsinn, Frage falsch verstanden. Dachte, du wolltest sowohl die größere, als auch die kleinere kleinste Differenz.
                    Crashkurs zum Thema Rechtschreibung: normalerweise (normaler weise oder normaler weiße), Standard (Standart), eben (ebend)

                    Kommentar


                    • #11
                      Warum reicht ABS(t2.spalte - t1.spalte) als Distanz nicht?
                      Standards - Best Practices - AwesomePHP - Guideline für WebApps

                      Kommentar

                      Lädt...
                      X