SQL选择动态计数

时间:2017-07-27 19:20:59

标签: sql postgresql

假设我有一个表foo,我想从中选择每个类别的N行

create table foo(name text, category text);

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

现在我想从foo中选择一些类别

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

结果应该是3行(关系可以随机解决或按任意顺序解决)

 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

我可以使用多个查询执行此操作,但我认为我遗漏了一些非常明显的内容,并且可以使用单个查询完成选择。

2 个答案:

答案 0 :(得分:3)

SELECT x.*
FROM categories c,
LATERAL (
  select * FROM foo
  where foo.category = c.category 
  ORDER BY random()
  LIMIT c.count
) x

演示:http://sqlfiddle.com/#!17/e0f14/7

答案 1 :(得分:1)

您可以使用position

row_number()