ich bin noch frischer PG-User und möchte gern “benutzerspezifisch” gruppieren.
Bsp-Tab abc unten und dann als 1. Gruppe A-C, 2. Gruppe = D-E etc., um dann jeweils die Summe der Spalte rank zu erhalten.
Bin unter GROUP BY und den hiesigen Beiträgen noch nicht fündig geworden… eine 2. Tabelle für left-joins geht für mich nicht, da only-read rights.
Alternativ geht das auch mit einer CASE expression:
select case
when letter in ('A','B','C') then 'A-C'
when letter in ('D','E') then 'D-E'
end as grp ,
sum(abc.rank)
from abc
group by grp
order by grp;
Das geht auch mit einem left join indem man die Gruppen als VALUES Liste zur Verfügung stellt.
select g.name,
sum(abc.rank)
from (
values
('Gruppe 1', array['A','B','C']),
('Gruppe 2', array['D','E'])
) as g(name, letters)
left join abc on abc.letter = any(g.letters)
group by g.name
order by g.name;
Danke @akretschmer für die Inspiration, den ASCII-Code für eine automatisch erzeugte Gruppierung herzunehmen, interessant! Es entstehen gleich große Klassen - ein Good-to-know für Statistiker merke ich mir, danke !
Es gibt noch eine weitere Alternative bei der man die Gruppen etwas “dynamischer” festlegen kann: über width_bucket():
select width_bucket(letter, array['A', 'D']) as grp,
sum(rank)
from abc
group by grp
order by grp;
Der zweite Parameter für width_bucket ist eine Liste von Werten die den Startwert jeder Gruppe definieren. Der obige Aufruf erzeugt also eine Gruppe von A-C und dann beginnend mit D (ohne Ende). Liefert halt nur 1 oder 2 zur Identifizierung der Gruppe, keine “sprechenden” Namen