在 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
我需要在 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