oracle随机洗牌整行

7xzttuei  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(234)

有一个包含3种类型记录的位置表(见下文)。我只需要选择记录类型='g'行。
我想将数据 Package 在一个循环中(即5次),但如何按位置\u id随机洗牌整行,使它们在循环的每次迭代中以不同的顺序出现?或许,将行粘贴到一个数组中并洗牌数组?
注意,我不想混乱的列,我希望行保持得体。将来可能会增加更多的地点。

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

我们有一个访问控制系统,当你滑动卡片时,它会以mmddyyy hh24:mi:ss格式记录卡片编号、位置标识、访问日期。
一些人想建立一个巡更系统。它将访问日期与巡更详细信息日期进行比较。如果在一定的标准内,比如说+2分钟或-2分钟,这意味着警卫准时,如果gt或lt 2分钟,我们记录一个早或晚,如果gt或lt 5分钟或没有访问历史记录,我们记录一个没有显示。
我被要求收集一些测试数据。如您所见,巡更详细记录包含mmddyyyyy hh24:mi:ss,因此我正在考虑将巡更详细记录更改为每小时一分钟一次,但我对此没有多少经验。

gjmwrych

gjmwrych1#

因此它们在循环的每次迭代中以不同的顺序出现
这是毫无意义的。您正在向表中插入行。行(在rdbms表中)不是按任何特定顺序存储的。
但是,您可以在从该表中进行选择时对它们进行排序,为此,必须使用 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>
wr98u20j

wr98u20j2#

假设你有一张5人的table 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

因此,只需在循环中重新设置查询或执行以下操作

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

相关问题