group by mit optionalen bool-Werten als Kriterium

Tom.S

Fleissiger Benutzer
Beiträge
62
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.
 
Werbung:
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)
 
Werbung:
Zurück
Oben