2

发现了一个类似的问题,但没有成功的答案。

我需要在单个表中选择每种状态类型的 50 个样本。

表格1

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

我试过:

SEL 成员,来自 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 回答