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

erster Datensatz in mehreren Gruppen mit Sortierung

Dieses Thema im Forum "Oracle" wurde erstellt von Ianras, 27 September 2016.

  1. Ianras

    Ianras Neuer Benutzer

    Hallo zusammen,

    ich habe folgende Daten:


    Projektnr - Status - Datum
    212 - 1 - 27.06.2016
    212 - 1 - 28.06.2016
    212 - 2 - 05.09.2016
    212 - 1 - 20.09.2016
    214 - 1 - 27.06.2016
    214 - 1 - 28.06.2016
    214 - 1 - 29.06.2016
    214 - 2 - 09.08.2016
    214 - 3 - 26.08.2016

    ---------------------------
    create table test
    (projektnr varchar2(50) NOT NULL, status number(10) NOT NULL, datum date default(sysdate));

    insert into test (projektnr, status, datum) VALUES (212, 1, to_date('27.06.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (212, 1, to_date('28.06.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (212, 2, to_date('05.09.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (212, 1, to_date('20.09.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (212, 1, to_date('27.06.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (214, 1, to_date('28.06.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (214, 1, to_date('29.06.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (214, 2, to_date('09.08.2016', 'dd.MM.YYYY'))
    insert into test (projektnr, status, datum) VALUES (214, 3, to_date('26.08.2016', 'dd.MM.YYYY'))
    ---------------------------

    und möchte nun den ersten Datensatz in der Gruppe (Projektnr und Status sortiert nach Datum) feststellen.

    Ergebnis dafür sollte so aussehen:

    Projektnr - Status - Datum
    212 - 1 - 27.06.2016
    212 - 2 - 05.09.2016
    212 - 1 - 20.09.2016
    214 - 1 - 27.06.2016
    214 - 2 - 09.08.2016
    214 - 3 - 26.08.2016


    Leider bekomme ich mit meinem Code:
    SELECT projektnr,
    status,
    datum,
    ROW_NUMBER ()
    OVER (PARTITION BY projektnr, status ORDER BY projektnr, datum)
    rnum
    FROM (SELECT *
    FROM ( SELECT ROW_NUMBER ()
    OVER (PARTITION BY projektnr, status
    ORDER BY projektnr, datum, status)
    nr,
    projektnr,
    status,
    datum
    FROM test
    ORDER BY projektnr, status, datum)
    WHERE nr = 1)


    dieses Ergebnis:
    Projektnr - Status - Datum
    212 - 1 - 27.06.2016
    212 - 2 - 05.09.2016
    214 - 1 - 27.06.2016
    214 - 2 - 09.08.2016
    214 - 3 - 26.08.2016


    Also 5 Datensätze anstatt 6 und es fehlt mir noch die Zeile mit dem Datum 20.09.2016.

    Für jeden Vorschlag und Lösung wäre ich sehr dankbar.
    Grüße
    Ianras
     
  2. unficyp

    unficyp Fleissiger Benutzer

    Versteh ich nicht, warum willst du den 20.9 ? Der ist nicht der 1. Datensatz in der Gruppe 212 , 1.

    Code:
    SELECT    *
    FROM
    (
    SELECT    projektnr,
            status,
            datum,
            ROW_NUMBER() OVER (PARTITION BY projektnr,status ORDER BY datum ASC) rn
    FROM    test
    )
    WHERE rn = 1
    bringt laut deiner Beschreibung richtig:

    Code:
    212    1    27/06/2016    1
    212    2    05/09/2016    1
    214    1    28/06/2016    1
    214    2    09/08/2016    1
    214    3    26/08/2016    1
     
  3. Ianras

    Ianras Neuer Benutzer

    wichtig ist, dass die Reihenfolge genau so wie vorgegeben ist, betrachtet werden muss, um den Verlauf zu zählen. Beim Projekt 212 wäre der Status: 1-2-1. Also 3 Statuswechsel.
    Laut meinem 2 Statuswechsel: 1-2
     
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