Announcement

Collapse
No announcement yet.

Unterabfrage? Zwischenabfrage?

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

  • Unterabfrage? Zwischenabfrage?

    Hallo!

    Habe ein Problem mit einer Teradata-DB.

    Die Tabelle Rohdaten besteht (verkürzt) aus Nummer, Sequenz, Indikator und Wert

    Tabelle: Rohdaten
    Nummer Sequenz Indikator Wert
    1000 1 A 5
    1000 2 B 6
    2000 1 A 7
    2000 2 T 9
    2000 3 B 4


    Nun habe ich folgendes Ergebnis (also alle Werte mit Indikator A):

    Nummer Sequenz Indikator Wert
    1000 1 A 5
    2000 1 A 7

    Ich bebötige jetzt noch die nächst höhere Sequenz die einen Indikator "B" hat.
    Wie lässt sich das bewerkstelligen?


    Danke!

    Gruß
    Tim

  • #2
    Dazu fehlen noch Informationen wie denn Sequenz beschaffen ist? Kommt nach A immer B? Kommt nach B immer C? Oder kann auch E kommen? Oder kommt immer T so wie in Deinem Beispiel?

    Wenn nach B immer C kommt (also jeder Buchstabe im Alphabet vorkommt), dann könnte man einfach den ASCII Wert hochzählen.

    Ansonsten könnte man eine Mapping Tabelle machen, so in etwa:

    Code:
    IdMapping Original Mapped
    1         A        B
    2         B        T
    Diese kann man dann einfach joinen und die gewünschten Ergebnisse dazu nehmen. Natürlich ist das nicht sehr dynamisch und muss gepflegt werden. Kommt auf die Anforderung an.

    Comment


    • #3
      Hallo!

      Nein, ist leider nicht immer gleich.
      Ich würde eine Abfrage absetzen.

      Als Pseudocode:
      select
      min(sequenz),
      wert
      where sequenz > ursprungssequenz
      and indikator = 'B'
      Danke!

      Gruß
      Tim

      Comment


      • #4
        Mit einer top-n Abfrage ginge das eigentlich relativ einfach. Das Problem ist ja eigentlich nur die nächste Sequenz zu finden

        [highlight=sql]
        SELECT top 1 sequenz
        FROM Rohdaten
        WHERE sequenz > 'A'
        ORDER BY sequenz
        [/highlight]

        Zusammengesetzt:

        [highlight=sql]
        SELECT *
        FROM Rodaten r
        WHERE r.Sequenz = 'A'
        OR
        EXISTS
        (
        SELECT *
        FROM
        (
        SELECT top 1 Sequenz
        FROM Rohdaten
        WHERE sequenz > 'A'
        ORDER BY sequenz
        ) smin
        WHERE smin.Sequenz = r.Sequenz
        )
        [/highlight]

        Top N Analysen sind allerdings vom DBMS abhängig. Für Deine Datenbank musst Du Dir die passende Lösung aussuchen. Ich hoffe das Vorgehen wird klar.

        Comment

        Working...
        X