Announcement

Collapse
No announcement yet.

Sql fortlaufende Nummer

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

  • Sql fortlaufende Nummer

    Hallo zusammen,

    ich will per SQL überprüfen ob eine Nummerierung Fortlaufend ist und dann für die fehlenden Nummern einen Dummy Wert eintragen:

    Datenbasis ist z.B:

    1 a
    2 a
    3 a
    4 a
    6 a
    7 a
    8 a


    Ergebnis sollte sein.


    21 a
    22 a
    23 a
    24 a
    25 dummy
    26 a
    27 a
    28 a


    Hat jemand eine Idee wie ich das rein mit Sql lösen kann.

    Oder anders kann ich per SQL eine Ausgabe einer Fortlaufenden Nummer zwischen einem bestimmten Bereich erreichen?

  • #2
    Originally posted by wolpertinger View Post
    Hallo zusammen,

    ich will per SQL überprüfen ob eine Nummerierung Fortlaufend ist und dann für die fehlenden Nummern einen Dummy Wert eintragen:

    Datenbasis ist z.B:

    1 a
    2 a
    3 a
    4 a
    6 a
    7 a
    8 a


    Ergebnis sollte sein.


    21 a
    22 a
    23 a
    24 a
    25 dummy
    26 a
    27 a
    28 a


    Hat jemand eine Idee wie ich das rein mit Sql lösen kann.

    Oder anders kann ich per SQL eine Ausgabe einer Fortlaufenden Nummer zwischen einem bestimmten Bereich erreichen?


    Hallo,

    So findest di den Gap zwischen den Zahlen (Es zeigt dir den "Range", der fehlt)

    Code:
      select ID, next_ID
          from (
        select ID, lead(ID) over (order by ID) next_ID
          from MISSING_NUMBERS
               )
         where ID <> next_ID-1
        /
    - Und dies gibt dir direkt die "fehlenden" Werte :

    Code:
    
    select ID+1
               from MISSING_NUMBERS t
               where NOT EXISTS ( select null
                                  from MISSING_NUMBERS t2
                                  where t2.ID = t.ID+1 )
        order by ID
        /
    (Allerdings ist dein Beispielergebnis nicht mit der Ausgangslage konsistent ?)


    Gruss

    Comment


    • #3
      Super danke das ist genau die Lösung die ich gesucht habe.

      Ausgang und Ergebnis werden im richtigen Szenario leicht umgeändert, aber deine Lösung funktioniert auch bei dem Szenario perfekt.

      Comment


      • #4
        hallo dbwizard.
        Deine Lösung zur Range zwischen den Gaps ist schon super! Leider berücksichtigt das Statement nicht, falls erste Einträge (mit 1 beginnend) fehlen. Wie könnte man dein Statement ändern, um das mit einzubeziehen? Am besten wäre als Ausgabe eine Liste mit allen fehlen Werten. Also hätte man in einer Tabelle folgende Datensätze:

        4,5,7,8

        wäre eine Ausgabe wünschenswert, welche die Werte

        1,2,3,6,9,10.. bis MAX enthält. Hättest du dafür eine Idee?

        Danke und besten Gruss!

        Comment


        • #5
          Eventuell kannst Du einen Row-Generator einsetzen. Da ich Deine Tabelle nicht kenne, habe ich mir in der WITH-Clause selber Beispieldaten gebaut. Man findet alle fehlenden Werte ab 1 bis zu max(ID), da in diesen Fällen ID und NAM NULL sind. Wenn ID sehr groß wird ist diese Variante ungünstig:
          Code:
          WITH data AS
          (
            SELECT 'A' nam,  2 id FROM dual UNION ALL
            SELECT 'B'    ,  3    FROM dual UNION ALL
            SELECT 'C'    ,  4    FROM dual UNION ALL
            SELECT 'E'    ,  7    FROM dual UNION ALL
            SELECT 'F'    ,  8    FROM dual UNION ALL
            SELECT 'T'    , 10    FROM dual UNION ALL
            SELECT 'X'    , 11    FROM dual
          ) SELECT lv, id, nam FROM data, ( SELECT level lv FROM dual CONNECT BY level<=(SELECT max(id) FROM data))
            WHERE lv=id(+)
            ORDER by lv;
          
          LV	ID	NAM
          -------------------
          1		
          2	2	A
          3	3	B
          4	4	C
          5		
          6		
          7	7	E
          8	8	F
          9		
          10	10	T
          11	11	X
          Wer fragt jetzt eigentlich @dbnovice oder @wolpertinger ?

          Comment

          Working...
          X