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

group by mit optionalen bool-Werten als Kriterium

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Tom.S, 29 Juni 2015.

  1. Tom.S

    Tom.S Fleissiger Benutzer

    Hallo,
    mal wieder eine Anfängerfrage von mir:

    Ich habe die folgende Tabelle, in der gibt es eine boolesche Spalte ist_hauptname und eine fk_id Spalte nach der ich gruppieren möchte:

    id | fk_id | name | ist_hauptname
    _________________________
    1 | 15 | Thomas J. | 0
    2 | 11 | Alex | 0
    3 | 11 | Alexander | 1
    4 | 15 | Thomas | 0
    5 | 3 | Joerg | 1
    6 | 3 | Jörg | 1

    Wie ihr seht, kann für eine fk_id bei ist_hauptname keine 1 gesetzt sein, genau eine 1 oder auch mehrere 1.
    Ich möchte jetzt nach fk_id gruppieren und zwar nach der folgenden Regel:
    Ist ist_hauptname für einen fk_id Wert in einer Zeile true, dann soll diese Zeile zurückgegeben werden. Ist keine Zeile oder sind mehrere Zeilen true, so soll einfach die mit der kleinsten id returniert werden.
    Das Ergebnis sähe wie folgt aus:

    1 | 15 | Thomas J. | 0
    3 | 11 | Alexander | 1
    5 | 3 | Joerg | 1

    Ich kann mir zwar sehr umständliche Querys mit geschachtelten SELECT vorstellen, hätte aber gerne eine einfache Lösung.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from tom;
     id | fk_id |  name  | hauptname
    ----+-------+-----------+-----------
      1 |  15 | thomas j  | f
      2 |  11 | alex  | f
      3 |  11 | alexander | t
      4 |  15 | thomas  | f
      5 |  3 | joerg  | t
      6 |  3 | joerg2  | t
    (6 rows)
    
    test=*# select * from (select id, fk_id, name, hauptname, row_number() over (partition by fk_id order by hauptname desc, id ) from tom) bla where row_number = 1 order by id;
     id | fk_id |  name  | hauptname | row_number
    ----+-------+-----------+-----------+------------
      1 |  15 | thomas j  | f  |  1
      3 |  11 | alexander | t  |  1
      5 |  3 | joerg  | t  |  1
    (3 rows)
    
    
     
    Tom.S gefällt das.
  3. Tom.S

    Tom.S Fleissiger Benutzer

    Großartig. Danke, darauf das ohne group by zu machen, wäre ich nie gekommen.
     
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