Случайные записи в таблице Oracle на основе условий - PullRequest
3 голосов
/ 09 мая 2019

У меня есть таблица Oracle со следующими столбцами

Структура таблицы

Table Structure

В запросе мне нужно вернуть все записи с CPER> = 40, что тривиально. Однако кроме CPER> = 40 мне нужно перечислить 5 случайных записей для каждого CPID. Я приложил образец списка записей. Однако в моей таблице около 50 000 записей. Ценю, если вы можете помочь.

Ответы [ 3 ]

1 голос
/ 09 мая 2019

Решение 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

SQL Server:

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
0 голосов
/ 09 мая 2019

Предполагая, что вам нужно пять дополнительных случайных записей, вы можете сделать:

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() перечисляет строки для каждого cpid в двух группах на основена значение cper.Внешний where принимает все значения cper в нужном диапазоне, а также пять из другой группы.

0 голосов
/ 09 мая 2019

Как на счет этого ...

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

Однако это не случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...