2

同様の質問が見つかりましたが、うまく機能する答えはありませんでした。

1 つのテーブル内で各ステータス タイプの 50 のサンプルを選択する必要があります。

表1

MEMBER  STATUS
1234       A
1324       A
3424       R
3432       S
3232       R
2783       A
2413       S
4144       R
2387       S

私は試した:

SEL メンバー、ステータス FROM TABLE1 Qualify Row_Number ( ) OVER (PARTITION BY status ORDER BY random (1,10000)) <=50

前の質問/回答で示唆されているように、Teradata は集計関数または順序付けられた分析関数での RANDOM が好きではありません。

4

2 に答える 2

4

あなたがコメントで言うように、あなたはrandomこれを行うことができる使用する必要はありません:

SEL     Member, status 
FROM    TABLE1 
QUALIFY ROW_NUMBER() OVER (
            PARTITION BY status 
            ORDER BY NULL) <= 50;

編集: スプール スペース エラーに関連するコメントの質問に基づいて、テーブルが大きい場合に試すことができるアプローチは、元のテーブルのレコードの一部を使用して一時テーブルを作成することです。

CREATE MULTISET VOLATILE TABLE tmp_tbl AS (
    SEL     Member, status
    FROM    TABLE1
    WHERE   somefield = 'somecriterion'
) WITH DATA 
ON COMMIT PRESERVE ROWS;

そして、もう一度やり直してください:

SEL     Member, status 
FROM    tmp_tbl /* now from temporary table */
QUALIFY ROW_NUMBER() OVER (
            PARTITION BY status 
            ORDER BY NULL) <= 50;
于 2012-06-08T16:31:05.043 に答える
3

個別の数の Status 値がある場合、Teradata によって WHERE 句が評価された後に TOP 演算子が処理される場合、次のアプローチが機能する可能性があります。TOP n実際には、Window Aggregate アプローチよりも好ましい方法であり、最高でより良いパフォーマンスを提供するか、最悪で同等のパフォーマンスを提供しますQUALIFY ROW_NUMBER() OVER()QUALIFY RANK () OVER()

SELECT TOP 50 
       Member
     , Status
FROM Table1
WHERE Status = 'A'
UNION ALL
SELECT TOP 50 
       Member
     , Status
From Table1
WHERE Status = 'R'
UNION ALL
SELECT TOP 50 
       Member
     , Status
FROM Table1
WHERE Status = 'S';

SAMPLEまた、サンプリングするステータス コードで各クエリをフィルタリングする句を使用して、複数のクエリを使用しても成功する場合があります。

于 2012-06-10T23:37:38.710 に答える