2

重複の可能性:
SQLで行をランダムに選択する方法は?

--Teradata12に--Transaction_IDとStore_nbrを持つテーブルTXNがあるとします。また、Store_nbrとn_samplesを持つテーブルSAMPがあるとします。

TXNからn_samplesTransaction_IDのサンプルを取得するとします。つまり、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、ところで)をどのように伝えることができますか?ストア1のtransaction_Idの2つのサンプル、ストア2のtransaction_Idの2つのサンプル、およびストア3のtransaction_Idの1つのサンプルを教えてください。

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テーブルはいつでも自由に変更できます。

4

1 に答える 1

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
于 2012-12-28T23:26:26.743 に答える