我正在尝试编写一个查询,该查询返回任意大小的代表性数据样本。我想通过仅选择第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工作:
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
有人对如何解决我的查询或更好的方法有任何想法吗?
我也曾考虑过使用随机数和概率来选择行,但是我宁愿做确定性的事情而不会结块。
第一次尝试的错误是您不能将聚合函数count(*)与 未聚合 的行选择混合使用。您可以改用count()as window- aggregate函数来解决此问题:
count(*)
count()
SELECT * FROM ( SELECT *, ((row_number() OVER (ORDER BY "time")) % ceil( **count(*) OVER ()** / 500.0)::int) AS rn FROM data_raw ) sub WHERE sub.rn = 0;