admin

通过平均跳过行来选择固定行数

sql

我正在尝试编写一个查询,该查询返回任意大小的代表性数据样本。我想通过仅选择第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

有人对如何解决我的查询或更好的方法有任何想法吗?

我也曾考虑过使用随机数和概率来选择行,但是我宁愿做确定性的事情而不会结块。


阅读 155

收藏
2021-06-07

共1个答案

admin

第一次尝试的错误是您不能将聚合函数count(*)未聚合 的行选择混合使用。您可以改用count()as window-
aggregate函数来解决此问题:

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;
2021-06-07