我有一个包含数据的表,其中有一个名为id的列,如下所示:

id value 1 value 2 value 3
1 244 550 1000
1 251 551 700
1 540 60 1200
... ... ... ...
2 19 744 2000
2 10 903 100
2 44 231 600
2 120 910 1100
... ... ... ...

我希望每id个存在的样本行中获取50个样本行,但如果存在少于50个行,则该组只需获取整个数据点集.

例如,我想从id = 1,id = 2等随机 Select 最多50个数据点.

我以前找不到任何与此类似的问题,但我至少在逻辑上try 过解决方案,其中我可以迭代和合并所有查询id并将其限制为50:

SELECT * FROM (SELECT * FROM schema.table AS tbl WHERE tbl.id = X LIMIT 50) UNION ALL;

但是很明显,您不能使用这种类型的解决方案,因为UNION ALL需要将输出从一个id聚合到下一个id,并且我没有一个id值的列表来代替tbl.id = X中的X.

有没有一种方法可以通过收集唯一的id个值的列表并合并所有结果来实现这一点,或者有没有更好的方法来实现这一点?

推荐答案

如果您希望从每组ID中获得50个(或更少),则可以使用窗口-

来自问题-"我希望 for each 存在的id获取50个样本行,但如果存在少于50个的行,则该组只需获取整个数据点集."

-你在说什么?

with data as (
select row_number() over (partition by id order by random()) rn,
* from table_name)
select * from data where rn<=50 order by id;

Fiddle.

Postgresql相关问答推荐

Postgres BULK INSERT如何影响Debezium?

使用Spring data jpa和CriteriaQuery在jsonb列中搜索操作

使用函数返回值作为另一个函数的参数

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

处理Ruust-DIESEL中的Jsonb PostgreSQL列

Gorm 中的更新将created_at、updated_at 作为默认时间

为什么我的唯一索引在 Postgresql 中不起作用?

如何 Select 任意行的相邻行(在 sql 或 postgresql 中)?

处理 sqlalchemy 断开连接的更好方法

保存 geodjango PointField 时出错

是否可以在 Postgres 中存储一个 1 字节的数字?

如何防止materialized 视图在 pg_restore 期间刷新?

为什么 PostgreSQL 数组访问在 C 中比在 PL/pgSQL 中快得多?

为 Django Postgres 连接强制 SSL

无法使用 sequelize 从本地 node 应用程序连接到 heroku postgresql 数据库

如何禁用 postgresql缓存优化?

如何在带有 PostgreSQL 数据库的 Web 应用程序中拥有完整的离线功能?

你如何在postgresql中做mysqldump?

在 postgresql 中对使用 array_agg 创建的文本聚合进行排序

PostgreSQL 中 from dual 的等价性