在 Aginity 中选择 1% 的样本 Workbench SQL

Selecting a 1% sample in Aginity Workbench SQL

我需要在 table 中随机抽取 1% 的记录样本(行数每秒都在增长)。

我的想法是

SELECT DISTINCT
   random(),
   name,
   age,
   registrationNumber
FROM everGrowingTable
ORDER BY random desc
LIMIT (
    (select count(*) from everGrowingTable) * 0.01
) -- this is attempting to get 1%

编译器抱怨 * 运算符。但是,当我硬编码 table 大小时很好。

我试过 IBM documentation,但这里讨论的是使用已知值的计算,而不是增长的值(在我的 table 中就是这种情况)

似乎没有 Aginity SQL 函数可以执行此操作。我注意到 Aginity Workbench Intellisense 中的 MINUS 函数,但是,没有乘法等价物。

您可以在子查询中使用 window 函数为每条记录分配一个随机数并计算总记录数,然后在外部查询中进行过滤:

SELECT name, age, registrationNumber
FROM (
    SELECT 
        name, 
        age, 
        registrationNumber,
        ROW_NUMBER() OVER(ORDER BY random()) rn,
        COUNT(*) OVER() cnt 
    FROM everGrowingTable
) x 
WHERE rn <= cnt / 100
ORDER BY rn