Snowflake cloud data platform 如何从不同年龄组中随机选择若干行?

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

我试图在python中创建一个for循环,将其连接到Snowflake,因为Snowflake不支持循环。 我想从不同年龄组中随机选择一些行。例如,30-40岁年龄组1500行,40-50岁年龄组1200行,50-60岁年龄组875行

有没有关于如何在Snowflake中进行循环的其他方法?

如果您想从每个组中随机抽取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);
因此,在您的案例中,分区并过滤年龄组而不是用户。

如果您想从每个组中随机抽取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显然是最简单的解决方案,也可能是最有效的。