我正在尝试编写一个返回任意大小的代表性数据样本的查询。我想通过只选择第 n 行来做到这一点,其中n 使得整个结果集尽可能接近任意大小。
我希望这在结果集通常小于任意大小的情况下工作。在这种情况下,应该返回整个结果集。
我发现了这个问题,它显示了如何选择每 n行。
这是我到目前为止所拥有的:
SELECT * FROM (
SELECT *, ((row_number() OVER (ORDER BY "time"))
% ceil(count(*)::FLOAT / 500::FLOAT)::BIGINT) AS rn
FROM data_raw) sa
WHERE sa.rn=0;
这会导致以下错误:
错误:列“data_raw.serial”必须出现在 GROUP BY 子句中或用于聚合函数位置:23
删除这样的计算n
:
SELECT * FROM (
SELECT *, (row_number() OVER (ORDER BY "time"))
% 50 AS rn FROM data_raw) sa
LIMIT 500;
我还尝试将计算移至 WHERE 子句:
SELECT * FROM (
SELECT *, (row_number() OVER (ORDER BY "time")) AS rn
FROM data_raw) sa
WHERE (sa.rn % ceil(count(*)::FLOAT / 500::FLOAT)::BIGINT)=0;
这也会导致错误:
错误:在 WHERE 位置中不允许使用聚合函数:108
有没有人对如何修复我的查询或更好的方法有任何想法?
我也考虑过使用随机数和概率来选择行,但我宁愿做一些确定性的事情,而不会出现聚集的可能性。