随机选择每组的不同行?

Randomly pick one distinct row of every group?

假设我在 Oracle 中有这个 SQL :

 select field1,field2 from table where field2 in (32,421,5766) and .....

它通常会 return 多行。 如何从 field2 定义的每个组中选择 3 个随机行,并且还匹配其余条件

使用 ROW_NUMBER 分析函数并对行进行随机排序:

SELECT field1,
       field2
FROM   (
  SELECT field1,
         field2,
         ROW_NUMBER() OVER ( PARTITION BY field2 ORDER BY DBMS_RANDOM.VALUE() )
           AS rn
  FROM   table_name
  WHERE  field2 IN (32, 421, 5766)
)
WHERE  rn = 1;

其中,对于示例数据:

CREATE TABLE table_name ( field1, field2 ) AS
SELECT LEVEL,    1 FROM DUAL CONNECT BY LEVEL <= 10 UNION ALL
SELECT LEVEL,   32 FROM DUAL CONNECT BY LEVEL <= 10 UNION ALL
SELECT LEVEL,  421 FROM DUAL CONNECT BY LEVEL <= 10 UNION ALL
SELECT LEVEL, 5766 FROM DUAL CONNECT BY LEVEL <= 10;

可能(随机)产出:

FIELD1 | FIELD2
-----: | -----:
     3 |     32
     6 |    421
     7 |   5766

db<>fiddle here