首页 > 解决方案 > 随机选择每组的一个不同的行?

问题描述

假设我在 Oracle 中有这个 SQL:

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

它通常会返回很多行。如何从 field2 定义的每个组中选择 3 个随机行 ONE 并匹配其余条件

标签: sqloraclerandomgreatest-n-per-group

解决方案


使用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;

可能(随机)输出:

字段1 | FIELD2
-----: | -----:
     3 | 32
     6 | 421
     7 | 5766

db<>在这里摆弄


推荐阅读