SQL 选择动态计数

标签 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

我可以用多个查询来做到这一点,但我认为我遗漏了一些非常明显的东西,选择可以用一个查询来完成。

最佳答案

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

关于SQL 选择动态计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45359328/

相关文章:

sql - 为什么子查询会导致扫描而静态列表不会?

mysql - 选择行时不需要的行

php - 输入字段提交最后一个索引,未选择索引

sql - 仅查询一个表时提高联合搜索 View 的查询性能

database - 如何在 emacs lisp 中执行 SQL 查询?

php - 使用邻接列表模型管理 MySQL 中的分层数据

mysql - 使用 Ruby 从 MySQL DB 创建 CSV 文件而不创建文件

sql - 如何获取字典中没有的单词?

postgresql - pgadmin postgresql - 注册新的本地服务器

postgresql - Postgres 在竞争条件中不存在的插入选择上出现重复的任何机会