2017-07-27 4 views
1

Angenommen, ich habe eine Tabelle foo aus dem ich aus jeder Kategorie N Zeilen auswählen mag, dassSQL-Select mit dynamischen Zählungen

create table foo(name text, category text); 

name | category 
------+---------- 
aaa | cat1 
bbb | cat1 
ccc | cat2 
ddd | cat2 
eee | cat2 

Jetzt würde ich gerne von foo gegeben eine Reihe von Kategorien wählen

category | count 
----------+------- 
cat2  |  2 
cat1  |  1 

Das Ergebnis sollte 3 Zeilen sein

name 
------ 
ccc 
ddd 
aaa 

-- wrong, not taking counts into account 
with t as (select * from (values ('cat1', 1), ('cat2', 2)) as 
t(category, count)) select name from foo, t where foo.category = t.category; 

name 
------ 
aaa 
bbb 
ccc 
ddd 
eee 

(Bande könnte zufällig oder durch eine beliebige Reihenfolge gelöst werden) Ich könnte dies mit mehreren Abfragen tun, aber ich denke, ich vermisse etwas sehr offensichtlich und die Auswahl kann mit einer einzigen Abfrage durchgeführt werden.

Antwort

1

würden Sie row_number() verwenden:

select foo.* 
from (select t.*, 
      row_number() over (partition by foo.category order by foo.category) as seqnum 
     from foo join 
      t 
      on foo.category = t.category 
    ) t 
where seqnum <= t.cnt;