Tengo una tabla Oracle con las siguientes columnas.

Estructura de la mesa

Table Structure

En una consulta, necesito devolver todos los registros con CPER> = 40, lo cual es trivial. Sin embargo, aparte de CPER> = 40, necesito enumerar 5 registros aleatorios para cada CPID. He adjuntado una lista de muestra de registros. Sin embargo, en mi mesa tengo alrededor de 50,000 registros. Aprecio si puedes ayudar.

3
FirstAider 9 may. 2019 a las 17:40

3 respuestas

La mejor respuesta

Solución de Oracle:

with CTE as
(
select t1.*, 
       row_number() over(order by DBMS_RANDOM.VALUE) as rn -- random order assigned
from MyTable t1
where CPID <40
)
select *
from CTE
where rn <=5 -- pick 5 at random

union all
select t2.*, null
from my_table t2
where CPID >= 40

Servidor SQL:

with CTE as
(
select t1.*, 
       row_number() over(order by newid()) as rn -- random order assigned
from MyTable t1
where CPID <40
)
select *
from CTE
where rn <=5 -- pick 5 at random

union all
select t2.*, null
from my_table t2
where CPID >= 40
1
JohnHC 9 may. 2019 a las 14:57

Suponiendo que desea cinco registros aleatorios adicionales , puede hacer lo siguiente:

select t.*
from (select t.*,
             row_number() over (partition by cpid,
                                             (case when cper >= 40 then 1 else 2 end)
                                order by dbms_random.value
                               ) as seqnum
      from t
     ) t
where seqnum <= 5 or cper >= 40;

row_number() enumera las filas para cada cpid en dos grupos, según el valor de cper. El where externo está tomando todos los valores de cper en el rango que desea, así como cinco del otro grupo.

0
Gordon Linoff 9 may. 2019 a las 15:21

Qué tal algo como esto...

SELECT *
FROM   (SELECT CID,
               CVAL,
               CPID,
               CPER,
               Row_number() OVER (partition BY CPID ORDER BY CPID ASC ) AS RN
        FROM   Table) tmp
WHERE  CPER>=40 OR pids <= 5

Sin embargo, esto no es al azar.

0
DxTx 9 may. 2019 a las 15:08