假设 - 在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表可随时更改。
答案 0 :(得分:0)
您可以使用row_number
和random()
:
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