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

SQL - nur Daten mit niedrigster ID ausgeben

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von winscheil, 27 April 2017.

  1. winscheil

    winscheil Benutzer

    Hallo, ich habe folgende Tabelle:

    Projekt ID Notiz
    12 1 abc
    12 2 xyz
    13 6 grt
    13 8 lkt
    15 3 dfg
    15 4 rtz

    Ich möchte immer nur die Notiz mit der niedrigsten ID von jedem Projekt ausgeben.
    Also am Ende soll es so ausgegeben werden:
    Projekt ID Notiz
    12 1 abc
    13 6 grt
    15 3 dfg

    Wie kann ich das machen?
    Mit Top 1, distinct und min(id) hat es nicht funktioniert.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from winschell ;
     p  | id | notiz
    ----+----+-------
     12 |  1 | abc
     12 |  2 | xyz
     13 |  6 | grt
     13 |  8 | lkt
     15 |  3 | dfg
     15 |  4 | rtz
    (6 Zeilen)
    
    test=*# select p, id, notiz from (select *, row_number() over (partition by p order by id) from winschell) foo where row_number = 1 ;
     p  | id | notiz
    ----+----+-------
     12 |  1 | abc
     13 |  6 | grt
     15 |  3 | dfg
    (3 Zeilen)
    
    test=*# select * from winschell where (p, id) in (select p, min(id) from winschell group by p);
     p  | id | notiz
    ----+----+-------
     12 |  1 | abc
     13 |  6 | grt
     15 |  3 | dfg
    (3 Zeilen)
    
    test=*#
    
     
  3. akretschmer

    akretschmer Datenbank-Guru

    einen hab ich noch:

    Code:
    test=*# select distinct on (p) p, id, notiz from winschell order by p, id ;
     p  | id | notiz
    ----+----+-------
     12 |  1 | abc
     13 |  6 | grt
     15 |  3 | dfg
    (3 Zeilen)
    
    test=*#
    
     
  4. akretschmer

    akretschmer Datenbank-Guru

    okay, okay, einen hab ich noch ;-)

    Code:
    test=*# select * from winschell right join (select p, min(id) as id from winschell group by p) x using (p, id);
     p  | id | notiz
    ----+----+-------
     12 |  1 | abc
     13 |  6 | grt
     15 |  3 | dfg
    (3 Zeilen)
    
    test=*#
    
     
  5. BerndB

    BerndB Datenbank-Guru

    Oder so ...


    Code:
    SELECT t.Projekt, n.ID, n.Notiz
    FROM yourTable t
    LEFT JOIN yourTable n ON t.Projekt = n.Projekt and t.min(ID) = n.ID
    GROUP by  t.Projekt;
     
  6. winscheil

    winscheil Benutzer

    so hat es funktioniert
    SELECT
    A.*
    FROM TABLE AS A
    INNER JOIN
    (
    SELECT
    Projekt,
    (MIN(ID)) AS "ID_min"
    FROM TABLE
    GROUP BY Projekt
    ) AS B
    ON (A.Projekt= B.Projekt) AND (A.ID = B.ID_min

    danke für die Hilfe
     
  7. akretschmer

    akretschmer Datenbank-Guru

    da fehlt noch eine ) - die schenke ich Dir hiermit ;-)
     
  8. akretschmer

    akretschmer Datenbank-Guru

    ... was allerdings nicht funktioniert, weil MySQL (und auch PostgreSQL) keine Aggregatsfunktionen in der Join-Condition erlauben. Das nur zur Klarstellung.
     
    BerndB gefällt das.
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