Announcement

Collapse
No announcement yet.

PL/SQL Schleife

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PL/SQL Schleife

    Hallo Zusammen,
    ich hoffe ihr könnt mir bei meinem Problem weiter helfen.

    Ich habe folgenden Code hier:

    declare
    v_sp number := 1;
    begin

    WHILE v_sp = (SELECT MAX(v_spalte) FROM abc) loop
    SELECT stats_crosstab INTO temp_table
    (z_spalte,v_spalte,'CHISQ_OBS')
    FROM abc
    WHERE v_spalte = v_sp;
    v_sp := v_sp + 1;
    END loop;

    end;
    /

    Dieser soll von der Tabelle "abc" die erste Zeile auslesen und mit "stats_crosstab" ausrechnen. Dann die ersten zwei Zeilen auslesen und ausrechenen. Dann die ersten drei Zeilen, ersten vier usw.

    Hoffe ihr habt da ein paar Ideen!?!

  • #2
    Hier ginge auch ein FOR LOOP in etwa so beispielhaft:
    Code:
    SET SERVEROUTPUT ON SIZE 100000;
    
    DECLARE
       max_abc   NUMBER;
       stat_cr    NUMBER;
    BEGIN
       SELECT max(v_spalte) INTO max_abc FROM abc;
       --max_abc :=3;
       FOR i IN 1 .. max_abc
       LOOP
          SELECT stats_crosstab(z_spalte,v_spalte, 'CHISQ_OBS')
            INTO stat_cr
            FROM abc
           WHERE ROWNUM <= i;
          DBMS_OUTPUT.put_line(i || '=' || stat_cr);
       END LOOP;
    END;
    Die Diskussion mit der Reihenfolge findet ja im parallelen Thread statt.

    Comment


    • #3
      Also ich habe jetzt den Code um den Chi-Quadrat auszurechnen. Allerdings zeigt dieser mir alle Ergenisse an. Nun will ich aber das nur der größte Chi-Qaudrat und/oder die kleinste Chi-Signifikanze angezeigt wird. Ich weiß, dass dabei der Cursor eine Rolle spielt. Nur bin noch nicht darauf gekommen wie ich es einsetzen kann. Vielleicht könnt ihr mir weiter helfen!!

      Code:
      DECLARE
         max_abc   NUMBER;
         min_abc   NUMBER;
         stat_sq   NUMBER;
         stat_sig  NUMBER;
      
      BEGIN
       SELECT MAX(age) INTO max_abc FROM richard.credit;
       SELECT MIN(age) INTO min_abc from richard.credit;
      
      
      FOR i IN min_abc .. max_abc LOOP
      
      SELECT 
        
        STATS_CROSSTAB(rueckzah,attribute_group,'CHISQ_OBS') as       chi_square,
        
        STATS_CROSSTAB(rueckzah,attribute_group,'CHISQ_SIG') as      significance 
      
      INTO stat_sq, stat_sig
      
      FROM 
      ( 
        SELECT rueckzah, 
         CASE
          WHEN age <= i then 1 
          WHEN age > i then 2 
         END attribute_group 
        FROM 
         richard.credit
      );
      
      
      DBMS_OUTPUT.put_line(i || '=' || TO_CHAR(stat_sq,'99.99') || TO_CHAR(stat_sig,'99.99'));
      END LOOP;
      END;
      Viele Grüße

      Comment


      • #4
        Da geht z.B. nach dem Standart-Algorithmus für max, min in Schleifen:
        1. deklariere zwei Variablen, eine für das größte Chi-Qadrat (=0), eine für die kleinste Chi-Signifikanz (=9999999 ?)
        2. vergleiche in jedem Duchlauf diese Variablen mit dem aktuellen Wert und korrigiere sie falls nötig
        3. gib zum Schluss diese Variablen aus
        Es geht sicher auch schneller, effektiver, evtl. kann man gleich die Maxima/Minima Selektieren...

        Comment


        • #5
          Ich kann mir darunter nicht wirklich was vorstellen. Bin relativ neu in diesem Gebiet.
          Hättest du da eine Idee wie das aussehen könnte?

          Viele Grüße
          Mohsen

          Comment


          • #6
            Es soll ja nicht nur allein den Chi-Quadrat oder die Chi-Signifikanze ausgeben.

            Die Ausgabe könnte folgender Maßen aussehen:

            chi_square chi_significance
            -------------- -------------------
            34,56 0,0001
            25,78 0,0212
            65,89 0,3278

            d.h. die Ausgabe sollte natürlich den größten Chi-Quadrat mit der entsprechenden Chi-Signifikanze ausgeben. Gleichzeitig soll diese aber auch die kleinste Signifikanze beachten. Hoffe du kannst dir damit ein besseres Bild machen.

            Comment


            • #7
              Was hast Du bisher unternommen ? Wo, klemmt es, welches Problem hast Du konkret ?
              Ein stark vereinfachtes Beispiel wäre:
              Code:
              SET SERVEROUTPUT ON SIZE 100000;
              
              DROP   TABLE credtest;
              
              CREATE TABLE credtest  ( z NUMBER, v NUMBER );
              
              INSERT INTO  credtest VALUES (101, 123.45);
              
              INSERT INTO  credtest VALUES (207, 525.15);
              
              INSERT INTO  credtest VALUES (308, 197.03);
              
              INSERT INTO  credtest VALUES (400, 834.71);
              
              INSERT INTO  credtest VALUES (105, 87.03);
              
              INSERT INTO  credtest VALUES (245, 632.23);
              
              COMMIT ;
              
              DECLARE
                 chi_max  NUMBER := -1;
                 chi_min  NUMBER := 99999999;
                 sct      NUMBER;
              BEGIN
                 FOR i IN 2 .. 6
                 LOOP
                    SELECT stats_crosstab(z, v, 'CHISQ_OBS') INTO sct FROM credtest WHERE ROWNUM <= i;
                    IF chi_max < sct THEN chi_max := sct;  END IF;
                    IF chi_min > sct THEN chi_min := sct;  END IF;
                    --DBMS_OUTPUT.put_line(sct);
                 END LOOP;
                 DBMS_OUTPUT.put_line('Min=' || chi_min || ' Max=' || chi_max);
              END;
              
              AUSGABE:
              -----------------------------------------------------------------------
              Min=2 Max=29,50000000000000000000000000000000000009

              Comment


              • #8
                Hallo jum!
                Die Idee ist nicht schlecht. Aber sie passt nicht zu 100% zudem was ich haben will.
                ich habe folgende Ausgabe:

                age chi-square chi-significance
                ---- ----- -----
                18= .99 .32
                19= 2.00 .16
                20= 4.08 .04
                21= 3.87 .05
                22= 1.42 .23
                23= 1.24 .27
                24= .99 .32
                25= 1.50 .22
                26= 2.77 .10
                27= 2.58 .11
                28= 3.86 .05
                29= 5.55 .02
                30= 9.69 .00
                31= 10.88 .00
                32= 11.31 .00
                33= 16.78 .00
                34= 21.88 .00
                35= 21.88 .00
                36= 27.83 .00
                37= 27.94 .00
                38= 35.07 .00
                39= 35.07 .00
                40= 30.84 .00
                41= 28.84 .00
                42= 21.58 .00
                43= 15.35 .00
                44= 18.00 .00
                45= 20.32 .00
                46= 15.81 .00
                47= 20.82 .00
                48= 20.82 .00
                49= 19.29 .00
                50= 19.15 .00
                51= 17.70 .00
                52= 14.89 .00
                53= 13.54 .00
                54= 13.54 .00
                55= 12.22 .00
                56= 10.94 .00
                57= 10.94 .00
                58= 6.13 .01
                59= 3.94 .05
                60= 1.96 .16
                61= .36 .55
                62= .36 .55
                63= .36 .55
                64= .36 .55
                65= .36 .55
                66= 1.03 .31
                67= 1.03 .31
                68= .00 .00

                Nun möchte ich daraus folgendes rausfiltern:

                age chi_square chi_significance
                --- ------- -----
                38= 35.07 .00
                39= 35.07 .00
                40= 30.84 .00

                Natürlich kann es auch passieren, dass der Chi-Quadrat zwar klein ist aber der Signifikanze ist gegen 0 geht. Diese sollen natürlich auch angezeigt werden.

                Comment


                • #9
                  Was hast Du bisher unternommen ? Wo, klemmt es, welches Problem hast Du konkret ?
                  Die letzten paar Prozent zu 100 wirst Du ggf. selbst erledigen müssen

                  Comment

                  Working...
                  X