2017-10-06 101 views
0

我需要从(约)230,000行(每行上有一个唯一的自动生成编号)生成(约)2500行的系统随机样本。系统随机抽样 - Teradata SQL Ast

这可能使用Teradata SQL ast吗? (样本函数产生一个简单的随机样本。)

谢谢你的时间。

+0

Sample函数产生**简单的**随机样本。你如何定义*系统*部分? – dnoeth

+0

是的,它确实产生了一个简单的随机样本。我的问题的重点 - 但我想我的脑子已经系统化了!系统样本是间隔样本。我需要选择一个随机开始(简单随机采样),然后以2500的间隔选择行。例如:如果我的随机开始是行号1000,那么我会选择行号3500,然后选择行号6000,然后选择行号8500等等。 – Kristen

回答

1
select rank() over(order by $primary_index_key), t1.* 
FROM 
(select * from $table_name 
sample 2500) t1 

助理会这样做,其他客户也会这样做。 同样的方法可以用来生成获胜的强力球号码。

+0

我可能会错过一些东西,但我认为这会为我提供一个简单的随机样本,而不是一个系统的样本。 – Kristen

1

时,已经是一个不间断的唯一行号:

select t.* 
from mytable as t 
cross join 
(select random(1,2500) as rnd) as dt -- random start row 
where rownumber mod 2500 = rnd   -- every 2500 rows 

否则ROW_NUMBER可用来创建它:

select t.* 
from mytable as t 
cross join 
(select random(1,2500) as rnd) as dt 
qualify ROW_NUMBER() OVER (ORDER BY whatever_determines_your_order) mod 2500 = rnd 
0

从您的意见,我认为你不能做对飞。首先,您需要将包含步骤#和step_value,例如生成一些表:

[1,2500],[2,5000],... [X,X * 2500]

比你应该将此表连接到您的查询并按逻辑限制行号:rn = random_seed + step_value。 它看起来像这样:

select 
from (
select t1.* 
, row_number() over("ordering logic") as rn 
from my_table 
) as t1 
, (select random(1,2500) as random_seed) as seed --so it will be generated only once 

where exists (
    select 1 from sampling_table as t2 
    where t1.rn = t2.step_value + seed.random_seed 
)