Announcement

Collapse
No announcement yet.

Bestimmte Punkte suchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bestimmte Punkte suchen

    Hallo

    ich hab ein kleines Problem bei einer Abfrage. Meine Datenbank beinhaltet Punkte mit dem RW, HW, Höhe, Pkt_Art, Zusatz und einem Zeitstempel. Wenn ich zum Beispiel folgende Abfrage starte, dann erhalte ich alle Punkte, die den selben RW und Hochwert haben und absteigend nach der Höhe geordnet sind.

    Code:
    select a.pkt_id, a.pkt_geom.sdo_point.x as RW,
    a.pkt_geom.sdo_point.y as HW, a.pkt_hoehe, a.pkt_art, a.zusatz,
    to_char(a.zeitstempel, 'dd.mm.yyyy hh24:mi:ss') as zeitstempel
    from punkte a
    where a.pkt_geom.sdo_point.x = 4511193
    and a.pkt_geom.sdo_point.y = 5664551
    order by a.pkt_hoehe desc
    Stab 1 4511193/5664551


    315997 4511193 5664551 130,07 10
    345228 4511193 5664551 129,99 0
    347567 4511193 5664551 129,37 10
    347602 4511193 5664551 129,11 10
    347610 4511193 5664551 129,01 10
    348700 4511193 5664551 128,03 10
    348750 4511193 5664551 127,9 10
    349925 4511193 5664551 127,86 10
    349938 4511193 5664551 127,85 10
    364196 4511193 5664551 126,5 10
    364838 4511193 5664551 124,5 10
    365012 4511193 5664551 124,06 10
    366569 4511193 5664551 123,48 10
    366841 4511193 5664551 123,32 10
    366854 4511193 5664551 123,3 10
    366864 4511193 5664551 123,29 10
    368459 4511193 5664551 123,19 10
    379246 4511193 5664551 121,89 10
    379252 4511193 5664551 121,84 10
    379261 4511193 5664551 121,48 10
    379497 4511193 5664551 120,83 10
    381167 4511193 5664551 120,4 0
    381493 4511193 5664551 120,3 0
    390913 4511193 5664551 118,55 0
    391529 4511193 5664551 117,24 0
    392250 4511193 5664551 116,93 0
    392269 4511193 5664551 116,91 0
    392760 4511193 5664551 116,88 0
    400255 4511193 5664551 116,22 0
    400638 4511193 5664551 115,65 0
    401218 4511193 5664551 115,6 0

    Stab 2 4511123/5664580,5

    110644 4511123 5664580,5 120,28 0
    110655 4511123 5664580,5 120,24 0
    110661 4511123 5664580,5 120,2 0
    110753 4511123 5664580,5 119,96 0
    110757 4511123 5664580,5 119,67 0
    110765 4511123 5664580,5 119,65 0
    127541 4511123 5664580,5 119,61 10
    127548 4511123 5664580,5 119,6 10
    186117 4511123 5664580,5 119,54 0
    186124 4511123 5664580,5 119,53 0
    191294 4511123 5664580,5 119,51 10
    191295 4511123 5664580,5 119,5 1 0
    191296 4511123 5664580,5 119,49 10
    191299 4511123 5664580,5 119,46 10
    191304 4511123 5664580,5 119,44 10
    191307 4511123 5664580,5 119,42 10
    193249 4511123 5664580,5 118,66 10
    193251 4511123 5664580,5 118,65 10
    193261 4511123 5664580,5 118,63 10
    193415 4511123 5664580,5 118,24 10
    195683 4511123 5664580,5 118,21 10
    219952 4511123 5664580,5 117,78 10
    220322 4511123 5664580,5 117,71 10
    220324 4511123 5664580,5 117,7 10
    220486 4511123 5664580,5 117,09 10
    220492 4511123 5664580,5 117,08 10
    220834 4511123 5664580,5 116,76 10
    221559 4511123 5664580,5 116,38 10
    225374 4511123 5664580,5 116,05 10
    225391 4511123 5664580,5 116,01 10
    225402 4511123 5664580,5 115,96 10

    Jetzt möchte ich aber gerne bestimmte Punkte aus den beiden Bildern filtern. Und zwar alle Punkte von der Pkt_art = 10 unter denen sich keine Punkte der gleichen Art in einem bereich von 0,5 befinden. Und alle Punkte von der Pkt_art = 0 über denen sich keine Punkte von der Pkt_art = 10 in einem bereich von 0,5 befinden.

    Das würde für das Stab 1 mit der Lage 4511193/5664551 bedeuten, dass die Abfrage mir nur den Punkt mit der Pkt_ID 379497 liefert, weil sich darunter im Abstand von 0,5 kein weiterer Punkt mit der 10 befindet und für das Stab 2 mit der Lage 4511123/5664580,5 sollte er mir nur den Punkte mit der Pkt_id = 110765 liefern, weil sich darüber keine Wert von der Pkt_art = 10 innerhalb von 0,5 befindet.

    Leider weiß ich nicht, wie ich es realisieren kann. Momentan habe ich nur eine View, die nur jeweils die Pkt_art Änderungen heraus schreibt. Also wenn von 0 auf 10, dann gibt den 0 Wert aus und wenn 10 auf 0, dann gib mir den 10 Wert aus. Aber das ist nicht ganz richtig.

    Könnt ihr mit weiterhelfen?

    LG
    JimK
    Zuletzt editiert von satan_jim_knopf; 23.08.2012, 08:09.

  • #2
    Also meine Idee ist ja in etwa so:

    suche alle Punkte mit der selben Lage wie der Ausgangspkt
    Wenn der Ausgangspunkt von der Pkt_art = 0
    dann suche alle Punkte die > Ausganspunkt_Höhe und < Ausgangspunkt_Höhe + 0.5 sind
    Enthält das Ergebnis keine Punkte von der Pkt_art = 10, dann setzte den Wert Zusatz des Ausgangspunkt auf 1

    Wenn der Ausgangspunkt von der Pkt_art = 10
    dann suche alle Punkte die < Ausganspunkt_Höhe und > Ausgangspunkt_Höhe - 0.5 sind
    Enthält das Ergebnis keine Punkte von der Pkt_art = 10, dann setzte den Wert Zusatz des Ausgangspunkt auf 1

    Aber ich weiß nicht, wie ich das in Oracle realisieren kann.

    Comment


    • #3
      Originally posted by satan_jim_knopf View Post
      Aber ich weiß nicht, wie ich das in Oracle realisieren kann.
      Deine Idee ist nicht wirklich verkehrt, Du kannst es aber einfacher haben. LAG und LEAD helfen dabei.
      Damit kannst Du ohne Probleme auf den Vorgänger oder Nachfolger eines Datensatzes unter einer spezifischen Sortiervorgabe zugreifen, so wie man es von Excel kennt, aber eben per SQL.

      hier findest Du Beispiele:
      http://www.oracle-base.com/articles/...-functions.php
      Gruß, defo

      Comment


      • #4
        Einen wunderschönen guten Morgen

        Vielen Dank für deine antwort defo. Ich hab es mal ausprobiert, aber wirklich komme ich da nicht. Aber mir ist aber beiim probieren noch etwas aufgefallen. Wenn der Ausgangspkt von pkt_art=0 ist, dann muss in dem Bereich +0.5 m pkt_hoehe geprüft werden, ob sich da nur Punkte selber Pkt_art befinden, wenn ja, dann muss vom Ausgangspkt im Bereich -0.5 m pkt_hoehe gerüft werde, ob sich nur da Punkte von der Pkt_art = 10 befinden. Wenn beides zutrifft, dann soll er mir den Ausgangspkt markieren.

        LG
        JimK

        Comment


        • #5
          wenn ich dich in deinem ersten Post richtig verstanden habe, geht es nicht nur um 0,5 um den Ausgangspunkt, sondern allgemein darum in jedem 0,5-Bereich nur einen Punkt zu liefern.
          ich würde einfach mit einem group by mit round(bereich*2) arbeiten. So bekommst du immer nur einen Satz in einem bestimmten Bereich.

          Comment


          • #6
            Ich habe in meinem vorhergehenden Post einen Denkfehler drin.

            Leider habe ich es nicht hinbekommen Bilder von meinem Datensatz in eine vernünftigen Größe einzufügen. Darum habe ich die zwei Datenzätze oben nochmal bearbeitet und versuche es mal anhand denen zu erklären.

            Tabellenaufbau ist jetzt: ID RW HW Hoehe Pkt_Art

            Schritt 1:
            Ich habe einen Ausgangspunkt von der Punkt_Art = 0 und prüfe diese, ob der Punkte, der direkt darunter liegt von der Pkt_Art = 10 ist.

            Das ist nicht das Problem. In dem Beispiel Datensatz würde er jetzt zum Beispiel den Punkte mit der ID 110765 liefern

            Schritt 2:

            Jetzt möchte ich diesen Punkt darauf prüfen, ob sich in dem Bereich Ausgangspunkthöhe < als die eines Anderen und die Höhe der anderen Punkte muss < als die Ausgangspunkt + 0.5 sein.

            Bleiben wir bei der ID 110765
            In diesem Fall sollte er mir die Punkte mit der ID 110757, 110753 liefern.

            Schritt 3:

            Weil diese beiden Punkte von der Pkt_art = 0 sind, soll er mir den Ausgangspunkt mit der ID 110765 markieren

            Bleiben wir weiter bei diesem Datensatz.

            Als nächstes soll er wieder wie im Schritt 1 Prüfen. Demnach sollte er mir den Punkt mit der ID 186124 liefern.
            Im Schritt 2 stellt er dann fest, dass ich in dem Bereich noch Punkte von der Pkt_art 10 befinden.

            Darum soll der Ausgangspkt mit der ID 186124 nicht markiert werden.

            Als Ergebnis in diesem Datensatz soll die Datenbank mir also nur den Punkt mit der ID 110765 liefern.

            Puh... ich hoffe, ich konnte es gut erklären. Das ist nämlich gar nicht so einfach...

            Comment


            • #7
              Also ich bin bisher soweit gekommen:

              Code:
              select c3.* from punkte a1, punkte c2, punkte c3
              where a1.pkt_id = 186117
              and a1.pkt_art = 0
              and c2.pkt_id = 
              (select a2.pkt_id from punkte a2
              where a1.pkt_geom.sdo_point.x = a2.pkt_geom.sdo_point.x
              and a1.pkt_geom.sdo_point.y = a2.pkt_geom.sdo_point.y
              and a1.pkt_art != a2.pkt_art
              and a2.pkt_hoehe =
              (select min(p2.pkt_hoehe) from punkte p1, punkte p2
              where p1.pkt_id = a1.pkt_id
              and p1.pkt_geom.sdo_point.x = p2.pkt_geom.sdo_point.x
              and p1.pkt_geom.sdo_point.y = p2.pkt_geom.sdo_point.y
              and p1.pkt_hoehe < p2.pkt_hoehe))
              and c2.pkt_geom.sdo_point.x = c3.pkt_geom.sdo_point.x
              and c2.pkt_geom.sdo_point.y = c3.pkt_geom.sdo_point.y
              and c2.pkt_hoehe < c3.pkt_hoehe
              and c2.pkt_hoehe + 0.5 > c3.pkt_hoehe
              Damit wird geprüft, ob sich direkt über dem Punkt a1 ein Punkt anderer Pkt_Art befindet. Wenn ja, liefert wird dieser an c2 übergeben. Anschließend werden alle Ergebnisse, die sich über c2 von einem Höhenunterschied von 0.5 befinden, ausgegeben.
              Wie bekomme ich es jetzt realisiert, dass c2 ein Update erhält, wenn in dem Ergebniss von c3 keine Wert von einer anderen Pkt_art als die von c2 enthält - Sprich wenn c2 von pkt_art= 10 ist und das Ergebnis von c3 keine Punkte liefert, die von der pkt_art 0 sind?

              Comment


              • #8
                Originally posted by satan_jim_knopf View Post
                Jetzt möchte ich diesen Punkt darauf prüfen, ob sich in dem Bereich Ausgangspunkthöhe < als die eines Anderen und die Höhe der anderen Punkte muss < als die Ausgangspunkt + 0.5 sein.
                Der Satz gibt von vorn bis hinten keinen Sinn...

                Verstehe ich dich diesmal richtig?
                Du willst alle Punkte mit selber Punktart, die nicht mit anderen Punkten derselben Punktart auf einen kleinen Bereich gequetscht sind?

                Code:
                select id from punkte p where pkt_art = (select pkt_art from punkte where id=[ausgangspunkt])
                and not exists (select id from punkte where id!=p.id AND pkt_art=p.pkt_art AND p.position between [p.position +- 5])

                Comment


                • #9
                  Tut mir leid... es fällt mir immer so schwer meine Gedankengänge zu erklären. ^^
                  Hab es jetzt wie folgt gelöst.

                  Als erstes suche ich mir die Ober- und Unterkanten und setze die ermittelten Punkte den Zusatzwert auf 1.

                  Code:
                  select a2.* from punkte a1, punkte a2
                  where a1.pkt_geom.sdo_point.x = a2.pkt_geom.sdo_point.x
                  and a1.pkt_geom.sdo_point.y = a2.pkt_geom.sdo_point.y
                  and a1.pkt_art != a2.pkt_art
                  and a2.pkt_hoehe =
                  (select min(p2.pkt_hoehe) from punkte p1, punkte p2
                  where p1.pkt_id = a1.pkt_id
                  and p1.pkt_geom.sdo_point.x = p2.pkt_geom.sdo_point.x
                  and p1.pkt_geom.sdo_point.y = p2.pkt_geom.sdo_point.y
                  and p1.pkt_hoehe < p2.pkt_hoehe)
                  Ich erstelle eine View für die Erkennung der "Oberkanten".

                  Code:
                  select a1.pkt_id,(select count(b2.pkt_id)
                  from punkte b1, punkte b2
                  where a1.pkt_id = b1.pkt_id
                  and b1.pkt_geom.sdo_point.x = b2.pkt_geom.sdo_point.x
                  and b1.pkt_geom.sdo_point.y = b2.pkt_geom.sdo_point.y
                  and b1.pkt_hoehe < b2.pkt_hoehe
                  and b1.pkt_hoehe + 0.5 > b2.pkt_hoehe
                  and b1.pkt_art != b2.pkt_art) as Anzahl from punkte a1
                  where a1.zusatz = 1
                  and a1.pkt_art = 0
                  und eine View für die "unterkanten".

                  Code:
                  select a1.pkt_id,(select count(b2.pkt_id)
                  from punkte b1, punkte b2
                  where a1.pkt_id = b1.pkt_id
                  and b1.pkt_geom.sdo_point.x = b2.pkt_geom.sdo_point.x
                  and b1.pkt_geom.sdo_point.y = b2.pkt_geom.sdo_point.y
                  and b1.pkt_hoehe > b2.pkt_hoehe
                  and b1.pkt_hoehe - 0.5 < b2.pkt_hoehe
                  and b1.pkt_art = b2.pkt_art) as Anzahl from punkte a1
                  where a1.zusatz = 1
                  and a1.pkt_art = 10
                  Anschließend mache ich folgendes:

                  Code:
                  update punkte set zusatz = 2 where pkt_id in
                  (select pkt_id from finde_richtige_ob_gg
                  where anzahl > 0)
                  or pkt_id in
                  (select pkt_id from finde_richtige_ut_gg
                  where anzahl > 0)
                  Somit bleiben genau die Punkte in der Spalte Zusatz auf 1, die ich haben möchte.

                  Also im Stab 1:
                  379497 4511193 5664551 120,83 10

                  Im Stab 2:
                  110765 4511123 5664580,5 119,65 0


                  Ich dachte nur, dass ich es schneller und kürzer mit IF Then schaffe. Aber ich hab das leider noch nicht geschnallt.

                  Comment


                  • #10
                    Wie es aussieht verwendest du die Oracle Spatial Funktionen. Schau doch mal in der Doku nach ob es dort nicht bereits etwas Passendes gibt.
                    Die interessanten Packete sind für dich vermutlich SDO_GEOM, SDO_LRS und SDO_SAM.

                    Grundsätzlich gibt es dort Funktionen mit denen man z. B. festellen kann ob ein Punkt innerhalb eines Polygons liegt u.s.w.

                    Gruss

                    Comment


                    • #11
                      If then wäre eher was für PL SQL.

                      In einem Updatestatement bietet sich die Verwendung von CASE oder DECODE an, z.B.:
                      Update [mytable]
                      set [mycolum] = DECODE([EXPRESSION, Result1, UpdateValue1, Result2, UpdateValue2, .. ResultN, UpdateValueN, ElseUpdateValue]),
                      [otherColumn] = [fixvalue]
                      ...
                      Where [Condition]
                      Gruß, defo

                      Comment

                      Working...
                      X