深圳全飞鸿

标题: oracle对随机抽样的实现方案 -- 乱数排列 [打印本页]

作者: zhgc    时间: 2019-7-12 16:40
标题: oracle对随机抽样的实现方案 -- 乱数排列
  1. CREATE OR REPLACE PROCEDURE SFIS1.sp_oba_control (
  2.    p_line      IN       VARCHAR2,
  3.    DATA      IN       VARCHAR2,
  4.    mygroup   IN       VARCHAR2,
  5.    res       OUT      VARCHAR2
  6. )
  7. AS
  8.    c_wip                VARCHAR2 (25);
  9.    c_model              VARCHAR2 (25);
  10.    c_mo                 VARCHAR2 (25);
  11.    c_rate               NUMBER (10, 2);
  12.    c_hh                 NUMBER;
  13.    c_cycle              NUMBER;
  14.    c_count              NUMBER;
  15.    c_defect             NUMBER;
  16.    c_serial_number_no   NUMBER;
  17.    c_shift              VARCHAR2 (25);
  18.    c_model_type         VARCHAR2 (25);
  19.    c_sn                 VARCHAR2 (25);
  20.    c_group              VARCHAR2 (25);
  21.    c_groupname          VARCHAR2 (25);
  22.    c_wipgroup           VARCHAR2 (25);
  23.    c_linename           VARCHAR2 (25);
  24.    line             VARCHAR2 (25);
  25.    c_test_value2        NUMBER;
  26.    scrap                VARCHAR2 (1);
  27.    c_found              BOOLEAN;
  28.    c_begin              NUMBER;
  29.    c_end                NUMBER;
  30.    c_qty                NUMBER;
  31.    c_debug varchar2(35);
  32.    c_tmp varchar2(10);
  33.    CURSOR getobaroute
  34.    IS
  35.       SELECT data3, data4, data2, qa_rate
  36.         FROM sfis1.c_model_config_t
  37.        WHERE model_name = c_model
  38.          AND data3 = line
  39.          AND data4 = mygroup
  40.          AND CLASS = c_shift
  41.          AND qa_rate <> '0';
  42.    CURSOR debugstr
  43.    IS         
  44.    SELECT substr(lpad(kp_order,3,'0'),-2,2)
  45.            FROM sfis1.c_rand_order_t a
  46.           WHERE a.model_name = c_model
  47.             AND a.line_name = line
  48.             AND a.group_name = mygroup
  49.             AND TO_NUMBER (a.serial_number) BETWEEN 1 AND 10;         
  50. BEGIN
  51.    c_sn := DATA;
  52.    res := 'OK, NO SN';

  53.    SELECT mo_number, model_name, scrap_flag, group_name, wip_group,line_name
  54.      INTO c_mo, c_model, scrap, c_group, c_wip,line
  55.      FROM sfism4.r_wip_tracking_t
  56.     WHERE serial_number = DATA AND ROWNUM = 1;
  57.    
  58.    

  59.    c_shift := 'N';
  60.    c_hh := TO_CHAR (SYSDATE, 'HH24');

  61.    IF (c_hh >= 8 AND c_hh < 20)
  62.    THEN
  63.       c_shift := 'D';
  64.    END IF;

  65. /*
  66.    SELECT model_type
  67.      INTO c_model_type
  68.      FROM sfis1.c_model_desc_t
  69.     WHERE model_name = c_model;
  70. */-- IF (c_model IN ('52-001523')) AND (mygroup = 'OBA1')
  71.    --THEN

  72.    --   select   data3 line,
  73. --            data4 group,
  74. --            data2 wip
  75. --        from SFIS1.C_MODEL_CONFIG_T
  76.    res := '';

  77.    SELECT COUNT (1)
  78.      INTO c_count
  79.      FROM sfis1.c_model_config_t
  80.     WHERE model_name = c_model
  81.       AND data3 = line
  82.       AND data4 = mygroup
  83.       AND CLASS = c_shift
  84.       AND qa_rate <> '0';

  85.    IF (c_count = 0)
  86.    THEN
  87.       GOTO endproc;
  88.    END IF;

  89.    -- res := 'OK, NO CONFIG11';
  90.    c_found := TRUE;
  91.    c_begin := 0;
  92.    c_end := 0;

  93.    --  SELECT data3, data4, data2, qa_rate
  94.     --    FROM sfis1.c_model_config_t
  95.     --   WHERE model_name = c_model and data3=line AND data4 = mygroup and class=c_shift AND qa_rate <> '0';
  96.    OPEN getobaroute;

  97.    LOOP
  98.       FETCH getobaroute
  99.        INTO c_linename, c_groupname, c_wipgroup, c_rate;

  100.       DBMS_OUTPUT.put_line (   c_linename
  101.                             || ' '
  102.                             || c_groupname
  103.                             || ' '
  104.                             || c_wipgroup
  105.                             || ' '
  106.                             || c_rate
  107.                            );
  108.       EXIT WHEN getobaroute%NOTFOUND;


  109.       -- EXIT WHEN c_found = TRUE;
  110.        --c_rate := FLOOR (1 / c_rate);
  111.       c_rate := FLOOR (c_rate);

  112.       IF (c_rate > 100)
  113.       THEN
  114.          c_rate := 100;
  115.       END IF;

  116.       c_begin := c_end + 1;
  117.       c_end := c_end + c_rate;

  118.       SELECT COUNT (1)
  119.         INTO c_count
  120.         FROM sfism4.r_product_order_t
  121.        WHERE serial_number = c_sn AND group_name = mygroup AND ROWNUM = 1;

  122.       IF (c_count = 0) OR (NOT c_found)
  123.       THEN
  124.          c_found := FALSE;

  125.          SELECT COUNT (1)
  126.            INTO c_count
  127.            FROM sfism4.r_product_order_t
  128.           WHERE serial_number = c_sn AND group_name = mygroup AND ROWNUM = 1;

  129.          IF (c_count = 0)
  130.          THEN
  131.             --SELECT SFIS1.QA_SEQUENCE.NEXTVAL into c_count FROM DUAL;

  132.             SELECT COUNT (1)
  133.               INTO c_count
  134.               FROM sfism4.r_product_order_t
  135.              WHERE model_name = c_model
  136.                AND line_name = line
  137.                AND data1 = c_shift
  138.                AND group_name = mygroup AND ROWNUM=1;

  139.             -- MO_NUMBER=C_MO ;    -- NOT LINE ..
  140.             IF (c_count = 0)
  141.             THEN
  142.                c_count := 101;                        -- set to more than 100
  143.                c_cycle := 1;
  144.             ELSE
  145.                SELECT MAX (kp_order) + 1, MAX (kp_cycle)
  146.                  INTO c_count, c_cycle
  147.                  FROM sfism4.r_product_order_t
  148.                 WHERE model_name = c_model
  149.                   AND line_name = line
  150.                   AND data1 = c_shift
  151.                   AND group_name = mygroup ;
  152.             --MO_NUMBER=C_MO ;
  153.             END IF;
  154.             
  155.             /*INSERT INTO sfism4.r_product_order_t
  156.                         (serial_number, model_name, mo_number, line_name,
  157.                          group_name, work_time, kp_order, kp_cycle,
  158.                          wip_group, data1, data2
  159.                         )
  160.                  VALUES (c_sn, c_model, c_mo, line,
  161.                          mygroup, SYSDATE, c_count, c_cycle,
  162.                          c_wip, c_shift, 'SYANT'
  163.                         );    */         
  164.             res := 'OK, NO CONFIG11';

  165.             IF ((c_count MOD 100) = 1)
  166.             THEN
  167.             
  168.               INSERT INTO sfism4.r_product_order_t_bak
  169.               SELECT *
  170.                     FROM sfism4.r_product_order_t
  171.                    WHERE model_name = c_model
  172.                      AND line_name = line
  173.                       AND data1 = c_shift                     
  174.                      AND group_name = mygroup and kp_cycle=c_cycle;
  175.                /*delete  
  176.                     FROM sfism4.r_product_order_t
  177.                    WHERE model_name = c_model
  178.                      AND line_name = line
  179.                       AND data1 = c_shift                     
  180.                      AND group_name = mygroup and kp_cycle=c_cycle ; */  
  181.                      
  182.                                  
  183.                c_cycle:=c_cycle+1;
  184.                -- get new random data now!
  185.                DELETE FROM sfis1.c_rand_order_t
  186.                      WHERE model_name = c_model
  187.                        AND line_name = line
  188.                        AND group_name = mygroup;

  189.                INSERT INTO sfis1.c_rand_order_t
  190.                            (serial_number, model_name, line_name, group_name,
  191.                             kp_order, kp_cycle)
  192.                   SELECT ROWNUM, c_model, line, mygroup, DATA, c_cycle
  193.                     FROM (SELECT   DATA
  194.                               FROM sfis1.c_order_t
  195.                           ORDER BY DBMS_RANDOM.VALUE);
  196.                           
  197.                           

  198.                           
  199.             END IF;
  200.             
  201.             INSERT INTO sfism4.r_product_order_t
  202.                         (serial_number, model_name, mo_number, line_name,
  203.                          group_name, work_time, kp_order, kp_cycle,
  204.                          wip_group, data1, data2
  205.                         )
  206.                  VALUES (c_sn, c_model, c_mo, line,
  207.                          mygroup, SYSDATE, c_count, c_cycle,
  208.                          c_wip, c_shift, 'SYANT'
  209.                         );            

  210.           /*  INSERT INTO sfism4.r_product_order_t
  211.                         (serial_number, model_name, mo_number, line_name,
  212.                          group_name, work_time, kp_order, kp_cycle,
  213.                          wip_group, data1, data2
  214.                         )
  215.                  VALUES (c_sn, c_model, c_mo, line,
  216.                          mygroup, SYSDATE, c_count, c_cycle,
  217.                          c_wip, c_shift, 'SYANT'
  218.                         );  */
  219.          END IF;

  220.          SELECT kp_order
  221.            INTO c_count
  222.            FROM sfism4.r_product_order_t
  223.           WHERE serial_number = c_sn
  224.             AND line_name = line
  225.             AND group_name = mygroup
  226.             AND ROWNUM = 1;
  227.             
  228.             -----------------------
  229.                c_debug:='';
  230.                OPEN debugstr;

  231.                LOOP
  232.                   FETCH debugstr INTO c_tmp;
  233.                   EXIT WHEN debugstr%NOTFOUND;
  234.                   c_debug:=c_debug||c_tmp||'-';
  235.                END LOOP;
  236.                CLOSE debugstr;  
  237.               uPDATE sfism4.r_product_order_t
  238.            SET data2 = c_debug
  239.              WHERE serial_number = c_sn
  240.                   AND line_name = line
  241.             AND group_name = mygroup
  242.             AND ROWNUM = 1;                     
  243.                -------------------        

  244.          c_count := c_count MOD 100;
  245.          if(c_count=0)then
  246.              c_count:=100;
  247.          end if;         

  248.          SELECT COUNT (1)
  249.            INTO c_qty
  250.            FROM sfis1.c_rand_order_t a
  251.           WHERE a.model_name = c_model
  252.             AND a.line_name = line
  253.             AND a.group_name = mygroup
  254.             AND a.kp_order = c_count
  255.             AND TO_NUMBER (a.serial_number) BETWEEN c_begin AND c_end;

  256.         -- UPDATE sfism4.r_product_order_t
  257.          --   SET data2 = c_count || ' ' || c_begin || ' ' || c_end
  258.          -- WHERE serial_number = c_sn;                           --------------

  259.          --IF ((c_count MOD c_rate) = 0)
  260.          
  261.          
  262.          
  263.          IF (c_qty > 0)
  264.          THEN
  265.            -- UPDATE sfism4.r_product_order_t
  266.            --    SET data2 = '55'
  267.            --  WHERE serial_number = c_sn;                        --------------

  268.             -- c_found := TRUE;
  269.             UPDATE sfism4.r_product_order_t
  270.                SET kp_flag = 1,
  271.                    kp_cycle = c_cycle,
  272.                    wip_group = c_wipgroup
  273.              WHERE serial_number = c_sn AND group_name = mygroup
  274.                    AND ROWNUM = 1;

  275.             UPDATE sfism4.r107
  276.                SET wip_group = c_wipgroup,
  277.                    next_station = c_wipgroup,
  278.                    rework_no = 'OBA'
  279.              WHERE serial_number = c_sn
  280.                AND group_name = c_groupname
  281.                AND error_flag = 0;

  282.             INSERT INTO sfism4.r117
  283.                SELECT *
  284.                  FROM sfism4.r107
  285.                 WHERE serial_number = c_sn;
  286.          END IF;
  287.       END IF;

  288.       EXIT WHEN getobaroute%NOTFOUND;
  289.    END LOOP;

  290.    CLOSE getobaroute;

  291.    --  res:='OK';
  292.    <<endproc>>
  293.    c_count := '';
  294. END;
  295. /
复制代码

作者: zhgc    时间: 2019-7-12 16:45
核心代码:

   SELECT ROWNUM,  DATA
                    FROM (SELECT   DATA
                              FROM sfis1.c_order_t
                          ORDER BY DBMS_RANDOM.VALUE)


得到的结果如下:

ROWNUM|DATA
1|54
2|52
3|25
4|75
5|82
6|17
7|53
8|61
9|34
10|20
11|12
12|18
13|37
14|32
15|48
16|26
17|92
18|78
19|43
20|22
21|86
22|19
23|66
24|1
25|7
26|56
27|3
28|16
29|64
30|38
31|27
32|76
33|5
34|88
35|91
36|4
37|87
38|11
39|23
40|40
41|8
42|94
43|74
44|14
45|30
46|85
47|31
48|21
49|42
50|29
51|63
52|36
53|84
54|24
55|13
56|58
57|73
58|67
59|6
60|33
61|100
62|28
63|83
64|89
65|2
66|99
67|96
68|79
69|68
70|71
71|95
72|9
73|41
74|62
75|72
76|51
77|70
78|69
79|97
80|46
81|55
82|57
83|49
84|80
85|98
86|50
87|47
88|15
89|60
90|90
91|45
92|35
93|39
94|81
95|10
96|77
97|59
98|65
99|44
100|93

那mysql中如何实现呢?
作者: zhgc    时间: 2019-7-12 16:46
mysql 参考

SELECT * FROM sfc.c_line_desc_t ORDER BY RAND()




欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/) Powered by Discuz! X3.2