Snowflake cloud data platform 如何从不同年龄组中随机选择若干行?
我试图在python中创建一个for循环,将其连接到Snowflake,因为Snowflake不支持循环。 我想从不同年龄组中随机选择一些行。例如,30-40岁年龄组1500行,40-50岁年龄组1200行,50-60岁年龄组875行 有没有关于如何在Snowflake中进行循环的其他方法?如果您想从每个组中随机抽取n个样本,您可以创建一个子查询,其中包含随机分布在每个组中的行号,然后从每个组中选择前n行 如果您有这样一张桌子:Snowflake cloud data platform 如何从不同年龄组中随机选择若干行?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我试图在python中创建一个for循环,将其连接到Snowflake,因为Snowflake不支持循环。 我想从不同年龄组中随机选择一些行。例如,30-40岁年龄组1500行,40-50岁年龄组1200行,50-60岁年龄组875行 有没有关于如何在Snowflake中进行循环的其他方法?如果您想从每个组中随机抽取n个样本,您可以创建一个子查询,其中包含随机分布在每个组中的行号,然后从每个组中选择前n行 如果您有这样一张桌子: USER DATE 1 2018-11-04 1
USER DATE
1 2018-11-04
1 2018-11-04
1 2018-12-07
1 2018-10-09
1 2018-10-09
1 2018-11-07
1 2018-11-09
1 2018-11-09
2 2019-11-02
2 2019-10-02
2 2019-11-03
2 2019-11-06
3 2019-11-10
3 2019-11-13
3 2019-11-15
此查询可用于为用户2和3返回两个随机行,为用户1返回3个随机行:
SELECT User, Date
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY User ORDER BY RANDOM()) as random_row
FROM Users)
WHERE
(User = 3 AND random_row < 3) OR
(User = 2 AND random_row < 3) OR
(User = 1 AND random_row < 4);
因此,在您的案例中,分区并过滤年龄组而不是用户。如果您想从每个组中随机抽取n个样本,您可以创建一个子查询,其中包含随机分布在每个组中的行号,然后从每个组中选择前n行
如果您有这样一张桌子:
USER DATE
1 2018-11-04
1 2018-11-04
1 2018-12-07
1 2018-10-09
1 2018-10-09
1 2018-11-07
1 2018-11-09
1 2018-11-09
2 2019-11-02
2 2019-10-02
2 2019-11-03
2 2019-11-06
3 2019-11-10
3 2019-11-13
3 2019-11-15
此查询可用于为用户2和3返回两个随机行,为用户1返回3个随机行:
SELECT User, Date
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY User ORDER BY RANDOM()) as random_row
FROM Users)
WHERE
(User = 3 AND random_row < 3) OR
(User = 2 AND random_row < 3) OR
(User = 1 AND random_row < 4);
因此,在您的例子中,分区并过滤年龄组而不是用户。您看过Snowflake的存储过程了吗?它们是Javascript,允许您在Snowflake中本地循环:
您看过Snowflake的存储过程了吗?它们是Javascript,允许您在Snowflake中本地循环:
Snowflake支持随机和确定性表格采样。例如: 返回一个表的样本,其中每行包含在样本中的概率为10%:
SELECT * FROM testtable SAMPLE (10);
Snowflake支持随机和确定性表格采样。例如: 返回一个表的样本,其中每行包含在样本中的概率为10%:
SELECT * FROM testtable SAMPLE (10);
你说雪花没有环是什么意思?SQL有循环,如果你能找到它们 以下查询符合您的要求:
WITH POPULATION AS ( /* 10,000 persons with random age 0-100 */
SELECT 'Person ' || SEQ2() ID, ABS(RANDOM()) % 100 AGE
FROM TABLE(GENERATOR(ROWCOUNT => 10000))
)
SELECT
ID,
AGE,
CASE
WHEN AGE < 30 THEN '0-30'
WHEN AGE < 40 THEN '30-40'
WHEN AGE < 50 THEN '40-50'
WHEN AGE < 60 THEN '50-60'
ELSE '60-100'
END AGE_GROUP,
ROW_NUMBER() OVER (PARTITION BY AGE_GROUP ORDER BY RANDOM()) DRAW_ORDER
FROM POPULATION
QUALIFY DRAW_ORDER <= DECODE(AGE_GROUP, '30-40', 1500, '40-50', 1200, '50-60', 875, 0);
你说雪花没有环是什么意思?SQL有循环,如果你能找到它们 以下查询符合您的要求:
WITH POPULATION AS ( /* 10,000 persons with random age 0-100 */
SELECT 'Person ' || SEQ2() ID, ABS(RANDOM()) % 100 AGE
FROM TABLE(GENERATOR(ROWCOUNT => 10000))
)
SELECT
ID,
AGE,
CASE
WHEN AGE < 30 THEN '0-30'
WHEN AGE < 40 THEN '30-40'
WHEN AGE < 50 THEN '40-50'
WHEN AGE < 60 THEN '50-60'
ELSE '60-100'
END AGE_GROUP,
ROW_NUMBER() OVER (PARTITION BY AGE_GROUP ORDER BY RANDOM()) DRAW_ORDER
FROM POPULATION
QUALIFY DRAW_ORDER <= DECODE(AGE_GROUP, '30-40', 1500, '40-50', 1200, '50-60', 875, 0);
您可以共享一些数据、期望的结果和您尝试过的内容吗?您可以共享一些数据、期望的结果和您尝试过的内容吗?存储过程很重要,您当然可以使用它们进行循环,但在这种情况下,在纯SQL中存在一个相当不复杂的解决方案,存储过程很重要,您当然可以使用它们进行循环,但在这种情况下,在普通SQL中存在一个相当不复杂的解决方案,它也可以被诱骗进行循环。当然,您可以直接使用Snowflake进行非平凡的采样,但不是在这里要求的细节级别……您是否考虑过:从t样本1200行中选择*,其中年龄组在30到40之间。其思想是,样本可能比随机排序更有效。并提供可重复性。你完全正确。使用样本和联合显然是最简单的解决方案,也可能是最有效的。当然,您可以直接使用Snowflake进行非琐碎的采样,但不能达到此处要求的详细程度……您是否考虑过:从t样本1200行中选择*,其中年龄组介于30和40之间的所有联合。其思想是,样本可能比随机排序更有效。并提供可重复性。你完全正确。使用SAMPLE和UNION显然是最简单的解决方案,也可能是最有效的。