2017-10-06 202 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 
)