获取n个随机记录,其中n存储在表中

时间:2012-12-28 23:13:02

标签: sql random sample teradata

  

可能重复:
  How to randomly select rows in SQL?

假设 - 在Teradata 12中 - 我有一个具有Transaction_ID和Store_nbr的表TXN。 假设我有一个包含Store_nbr和n_samples的表SAMP。

假设我想从TXN中获取n_samples Transaction_IDs的样本。即,我希望SAMP表能够驱动从TXN表中获取多少个transaction_id样本。如,

TXN
Transaction_ID Store_nbr
1              1
2              1
1              2
2              2
3              2

...和...

SAMP
store_nbr n_samples
1         2
2         2
3         1

那我怎么能告诉SQL(这是Teradata,顺便说一下):给我2个商店1的transaction_Id样本,2个商店2的transaction_Id样本和1个商店3的transaction_Id样本?

Teradata确实有条件样本概念:

select a,b
from foo
sample when a=1 then 5
       when a=2 then 10
       when a=3 then 7
end

...如果需要,我可以使用codegen方法创建(有数千个商店)。

SAMP表可随时更改。

1 个答案:

答案 0 :(得分:0)

您可以使用row_numberrandom()

执行此操作
select t.*
from (select t.*,
             row_number() over (partition by store_nbr
                                order by random(1,100000)) as seqnum
      from txn t
     ) t join
     samp s
     on t.store_nbr = s.store_nbr and
        t.seqnum <= s.n_samples

我不知道使用sample来实现此目的的简单语法。

出于好奇,这会被允许吗?

select t.*
from (select t.*,
             row_number() over (partition by store_nbr
                                order by rnd) as seqnum
      from (select t.*, random(1,100000) as rnd from txn t) t
     ) t join
     samp s
     on t.store_nbr = s.store_nbr and
        t.seqnum <= s.n_samples