随机选择每组的不同行?
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
假设我在 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