gpt4 book ai didi

sql - 从 Snowflake 中的表中选择随机百分比(使用 WHERE 子句时)

转载 作者:行者123 更新时间:2023-12-05 06:11:23 24 4
gpt4 key购买 nike

使用此页面作为指南:https://docs.snowflake.com/en/sql-reference/constructs/sample.html

对于本练习,我需要将表中的部分记录按 50/50 拆分:

这些工作。我得到了几乎正好 50% 的表行数:

SELECT * FROM MyTable SAMPLE (50);
SELECT * FROM MyTable TABLESAMPLE (50);

一旦我应用 WHERE 子句,SAMPLE 就不再有效:

SELECT * FROM MyTable
WHERE country = ‘USA’
AND load_date = CURRENT_DATE
SAMPLE (50);

这让我从上面的雪花页面找到了这个:

方法一;将示例应用于其中一个连接表

select i, j 
from table1 as t1 inner join table2 as t2 sample (50)
where t2.j = t1.i
;

方法二;将样本应用于连接表的结果

select * 
from (
select *
from t1 join t2
on t1.a = t2.c
) sample (50);

两种方法都有效,但返回的记录数是 57%,而不是两种情况下的 50%。

QUALIFY ROW_NUMBER() OVER (ORDER BY RANDOM()) 是更好的选择吗?虽然这确实适用于 WHERE 子句,但我不知道如何设置百分比而不是行计数最大值。示例:

SELECT * FROM MyTable
WHERE country = ‘USA’
AND load_date = CURRENT_DATE
QUALIFY ROW_NUMBER() OVER (ORDER BY RANDOM()) = (50)

--这给了我 50 行,而不是 50% 的行或 4,457 行(本例中 where 子句后的总行数是 8,914)

最佳答案

在执行 where 子句之前,您需要先对表进行采样。我相信在您的示例中,where 子句首先运行,然后对其进行采样。试试这个(未经测试):

with ct as (
SELECT * FROM MyTable SAMPLE (50)
)
select
*
from ct
WHERE country = ‘USA’
AND load_date = CURRENT_DATE

或者我想是这样的:

select 
*
from (SELECT * FROM MyTable SAMPLE (50))
WHERE country = ‘USA’
AND load_date = CURRENT_DATE

关于sql - 从 Snowflake 中的表中选择随机百分比(使用 WHERE 子句时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64017912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com