通过均匀跳过行来选择固定的行数
Posted
技术标签:
【中文标题】通过均匀跳过行来选择固定的行数【英文标题】:SELECT fixed number of rows by evenly skipping rows 【发布时间】:2014-11-19 09:32:43 【问题描述】:我正在尝试编写一个返回任意大小的代表性数据样本的查询。我想通过只选择 nth 行来做到这一点,其中 n 使得整个结果集尽可能接近任意大小。
我希望它在结果集通常小于任意大小的情况下工作。在这种情况下,应该返回整个结果集。
我找到了this question,它显示了如何选择每 nth 行。
这是我目前所拥有的:
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 中不允许使用聚合函数
有没有人对如何修复我的查询或更好的方法有任何想法?
我也考虑过使用随机数和概率来选择行,但我宁愿做一些确定性的事情,而不会出现聚集的可能性。
【问题讨论】:
顺便说一句,第 9.4 页?您正在使用测试版吗? 是的,我使用的是 9.4。 【参考方案1】:您第一次尝试的错误是您不能将聚合函数 count(*)
与 un-aggregated 行选择混合。您可以改用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;
这里有详细解释:
Best way to get result count before LIMIT was applied@Alexander 为您的最后一次尝试提供了修复。
【讨论】:
【参考方案2】:您应该将该计算设为子查询:
WHERE rn % (SELECT CEIL(COUNT(*)::FLOAT / 500:FLOAT)::BIGINT FROM data_raw) = 0
这样,它不再被视为一个聚合函数,而是一个标量查询。
【讨论】:
以上是关于通过均匀跳过行来选择固定的行数的主要内容,如果未能解决你的问题,请参考以下文章
通过 pandas.read_excel 在标题后跳过行范围