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

In Tabelle laufende Nummer vergeben

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von LT-Man, 3 April 2016.

  1. LT-Man

    LT-Man Neuer Benutzer

    Hallo Gemeinde,

    ich würde gerne in einer vorhandenen Tabelle mit ca. 1000 Personen allen Personen eine AdressID hinzufügen. Das soll eine fortlaufende Nummer sein, die dann für die jeweils gleiche Adresse auch bei untrerschiedlicher Anzahl Personen gleich ist und von 1 hochgezählt wird.
    Das Ziel ist also jeder Adresse eine ID.
    Mir fehlt leider eine Idee wie das als Script machbar ist, notfalls mache ich es über ein Programm.
    Vielleicht hat aber hier jemand eine Idee.

    Danke schon mal und Gruß
     
  2. Dukel

    Dukel Datenbank-Guru

  3. ukulele

    ukulele Datenbank-Guru

    Bei MSSQL würde ich das ganze am besten ohne Schleife lösen:
    Code:
    WITH t AS(
       SELECT   ROW_NUMBER() OVER (PARTITION BY Adressefelder ORDER BY PersonenID) AS AdressID,
           PersonenID
       FROM   tabelle
       )
    UPDATE   tabelle
    SET     tabelle.AdressID = t.AdressID
    FROM   tabelle
    INNER JOIN t
    ON     tabelle.PersonenID = t.PersonenID
    Voraussetzung ist natürlich eine entsprechende neue Spalte AdressID, eine vorhandene PersonenID und Adressfelder muss vermutlich mit Straße, Ort und PLZ ersetzt werden.
     
    Walter gefällt das.
  4. LT-Man

    LT-Man Neuer Benutzer

    Danke schon mal für die Antwort, ich mache wohl bei der Anpassung etwas falsch.
    Meine Felder heißen ID,Name,Vorname,Strasse und das Feld das befüllt werden soll GroupNo.
    So sieht es jetzt aus:

    WITH t AS(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID,name,vorname,strasse ORDER BY ID) AS AdressID,
    ID
    FROM Adr
    )
    UPDATE Adr
    SET adr.GroupNo = t.AdressID
    FROM Adr
    INNER JOIN t
    ON adr.ID = t.ID

    AS AdressID,PersonenID habe ich durch AS AdressID,ID ersetzt da PersonenID Ungültiger Spaltenname 'PersonenID' brachte.
    Das Ergebnis ist in jeder Zeile von GroupNo = 1
     
  5. ukulele

    ukulele Datenbank-Guru

    Code:
    WITH t AS(
       SELECT   ROW_NUMBER() OVER (PARTITION BY strasse ORDER BY ID) AS GroupNo,ID
       FROM   Adr
       )
    UPDATE   Adr
    SET     Adr.GroupNo = t.GroupNo
    FROM   Adr
    INNER JOIN t
    ON     Adr.ID = t.ID
    Wobei strasse normalerweise ja nicht zwangsläufig die selbe "Adresse" ist. Das wirst du aber besser wissen.
     
  6. LT-Man

    LT-Man Neuer Benutzer

    Habe das Script laufen lassen und komme auf 51 als höchste Groupno. Die normale Dubletten-Abfrage liefert aber 253 verschiedene Adressen in der DB. Kannst Du vielleicht nochmal drüber schauen.
    Die Abfrage:

    SELECT count(*) AS Dubletten , Strasse
    from Adr
    GROUP BY Strasse
    HAVING COUNT(*) > 1 order by Dubletten
     
  7. LT-Man

    LT-Man Neuer Benutzer

    achja, Strasse und Hausnummer sind in der gleichen Spalte
     
  8. ukulele

    ukulele Datenbank-Guru

    Du kannst das relativ leicht debuggen in dem du dir das Ergebnis von
    Code:
    SELECT ROW_NUMBER() OVER (PARTITION BY strasse ORDER BY ID) AS GroupNo,*
    FROM Adr ORDER BY 1
    anschaust dort siehst du wo er erneut anfängt zu zählen.
     
  9. Tommi

    Tommi Datenbank-Guru

    Hi,

    versuch es anstatt der Funktion ROW_NUMBER() mal mit DENSE_RANK():

    Code:
    SELECT   DENSE_RANK() OVER (ORDER BY Adressefelder) AS AdressID
    Viele Grüße,
    Tommi
     
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