Oracle случайное перемешивание целых строк - PullRequest
0 голосов
/ 21 июня 2020

имеет таблицу местоположений, содержащую 3 типа записей (см. Ниже). Мне нужно только выбрать строки SELECT record_type = 'G'.

Я хочу обернуть данные в al oop (ie 5 раз), но как я могу случайным образом перетасовать ВСЕ строки по location_id, поэтому они появляются в разном порядке с каждой итерацией l oop? Может быть, вставить строки в массив и перетасовать массив?

Обратите внимание, я не хочу перемешивать столбцы, я хочу, чтобы строка оставалась неизменной. В будущем могут быть добавлены другие местоположения.

CREATE TABLE locations AS
SELECT level AS location_id,
       'Door ' || level AS location_name,

CASE round(dbms_random.value(1,3)) 
            WHEN 1 THEN 'A' 
            WHEN 2 THEN 'T' 
            WHEN 3 THEN 'G' 
         END AS location_type

FROM   dual
CONNECT BY level <= 25;

SELECT * from tour_detail 
Order by tour_id, tour_time

TOUR_ID TOUR_TIME    LOCATION_ID
1   06212020 00:10:25   2
1   06212020 00:21:05   18
1   06212020 00:30:33   11
1   06212020 00:40:51   17
1   06212020 00:52:13   4
1   06212020 01:01:42   2
1   06212020 01:07:52   11

У нас есть система контроля доступа, когда вы сдвигаете карту, она записывает card_num, location_id, access_date в формате MMDDYYY HH24: MI: SS.

Некоторые хотели создать систему охранных туров. Это сравнивает access_date с подробной датой tour_detail. Если в рамках определенных критериев говорят + или - 2 минуты, это означает, что охрана была вовремя, если GT или LT 2 минуты, мы регистрируем раньше или позже, если GT или LT 5 минут или нет записи access_history, мы регистрируем неявку.

Меня попросили собрать некоторые данные тестирования. Как видите, записи tour_detail содержат MMDDYYYY HH24: MI: SS, поэтому я подумываю об изменении записей tour_detail на интервал от часа к минуте, но у меня мало опыта работы с этим.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

, поэтому они появляются в разном порядке на каждой итерации l oop

Это бессмысленно. Вы вставляете строки в таблицу. Строки (в таблице СУБД) не хранятся в каком-либо конкретном порядке.

Но вы можете отсортировать их при выборе из этой таблицы и - для этого - вам нужно используйте предложение order by.

На момент выбора посмотрите, поможет ли это:

SQL> with data as
  2    (select empno, ename, job, sal
  3     from emp
  4     where deptno = 20
  5     order by round(dbms_random.value(0, 15))
  6    )
  7  select column_value, d.*
  8  from data d cross join table(cast(multiset(select level from dual
  9                                             connect by level <= 5
 10                                            ) as sys.odcinumberlist));

COLUMN_VALUE      EMPNO ENAME      JOB              SAL
------------ ---------- ---------- --------- ----------
           4       7902 FORD       ANALYST         3000
           4       7788 SCOTT      ANALYST         3000
           2       7369 SMITH      CLERK           1000
           4       7369 SMITH      CLERK           1000
           1       7369 SMITH      CLERK           1000
           5       7566 JONES      MANAGER         2975
           1       7876 ADAMS      CLERK           1100
           1       7788 SCOTT      ANALYST         3000
           5       7788 SCOTT      ANALYST         3000
           3       7876 ADAMS      CLERK           1100
           1       7902 FORD       ANALYST         3000
           2       7876 ADAMS      CLERK           1100
           5       7902 FORD       ANALYST         3000
           3       7902 FORD       ANALYST         3000
           3       7566 JONES      MANAGER         2975
           1       7566 JONES      MANAGER         2975
           3       7788 SCOTT      ANALYST         3000
           2       7902 FORD       ANALYST         3000
           4       7566 JONES      MANAGER         2975
           5       7876 ADAMS      CLERK           1100
           2       7788 SCOTT      ANALYST         3000
           3       7369 SMITH      CLERK           1000
           4       7876 ADAMS      CLERK           1100
           2       7566 JONES      MANAGER         2975
           5       7369 SMITH      CLERK           1000

25 rows selected.

SQL>
0 голосов
/ 21 июня 2020

Допустим, у вас есть таблица с 5 ID s

create table tab as
select rownum id from dual connect by level <= 5;

Это дает случайный вывод строк

select * from tab order by dbms_random.value;

        ID
----------
         2
         4
         5
         1
         3

Если вы повторить утверждение, вы получите другой (случайный) результат

        ID
----------
         5
         4
         2
         1
         3 

Так просто повторите запрос в l oop или сделайте что-то вроде этого

with data as (
select 1 pass_id, id  from tab  
union all
select 2 pass_id, id  from tab  
union all
select 3 pass_id, id  from tab )
select * from data
order by 1,dbms_random.value
...