Re: kleines Sortierproblem: so gehts - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von H.Fehde (724 Beiträge) am Freitag, 27.Juni.2003, 19:50. WWW: bei123.de
    Re: kleines Sortierproblem: so gehts

      Kleine Routine
      <perl>
      get "Kundenname==*","Kunden";
      my %summe;
      while(get_next("Kunden"))
      {
      $summe{$Kundenname}+=$Betrag;
      }
      foreach my $key (sort {$summe{$a} <=> $summe{$b}} keys %summe)
      {
      out "$key : $summe{$key}<br>";
      }
      out "<hr>";
      </perl>
      

      H.Fehde


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von MichaelB (157 Beiträge) am Freitag, 27.Juni.2003, 15:20.
    kleines Sortierproblem:

      Hi Forum,

      hab folgendes Problem:
      - eine Datenbank mit sehr vielen Einträgen (<100.000)
      - in einem Datensatz steht jeweils ein Kunde und eine Verkaufssumme dazu
      - jeder Kunde kann beliebig oft eingetragen sein.

      ich brauche nun eine Ausgabe (Liste), an welchen Kunden am meisten verkauft wurde.

      Im Moment lösen wir das so:
      für Kunde Nr1 werden alle Einträge gesucht, die Verkaufssummen aufaddiert und das Ergebnis wird in eine extra Datenbank geschrieben.
      Dann kommt der nächste Kunde...usw.

      am Schluß wird aus der neuen Datenbank nach addierten Verkaufssummen sortiert ausgegeben.

      Dies funktioniert auch prima nur mit dem Nachteil, dass die Scripte ewig laufen (oft über das timeout des Browsers). Wenn wir die Laufzeiten verfolgen, dann sehen wir das das Schreiben in eine neue dB sehr viel Zeit benötigt.

      Weiß jemand eine elegantere Methode, welche die zweite DB umgeht?

      Vielen Dank schon mal fürs tüfteln

      Gruß Michael

     Antworten

    Beitrag von Pouraga (1396 Beiträge) am Freitag, 27.Juni.2003, 15:54.
    Re: kleines Sortierproblem:

      Nicht nur das schreiben in der neuen DB sondern auch das immer wieder Abfragen (so hab ich das jetzt verstanden) frisst unheimlich.


      Ich behaupte jetzt einfach mal das das alles mit einer einzigen Abfrage möglich ist.

      Also spinne ich mal los: (das alles jetzt gerade geschrieben und nicht und nicht ausprobiert, deshalb wird es wohl kaum auf anhieb funktionieren, aber man sieht die Richtung)


      get "Id==*","db";
      

      my %Kunden;

      while(get_next("db")){
      $Kunden{$Kundenname}++;
      }
      


      Jetzt dürfte/könnten alle Kunden in dem Hash stehen mit der anzahl wie oft sie vorkommen
      Danach noch sortieren und in einer schleife ausgeben wie man es möchte.


      my @sortierteKunden = sort keys %Kunden 
      

      foreach (@sortierteKunden) {
       out  "$_: $Kunden{$_}<br>\n";
      }
      


      Und fertig

      Wie gesagt das ganze ist nur ein Ansatz wie man es machen könnte.

     Antworten

    Beitrag von MichaelB (157 Beiträge) am Freitag, 27.Juni.2003, 16:01.
    Re: kleines Sortierproblem:

      haben wir auch schon dran gedacht - allerdings sagt unser (einziges) Perl-Buch, dass der hash in einer Spalte sortiert werden kann und die Werte nicht den Bezug zueinander behalten. Stimmt das?

     Antworten

    Beitrag von Pouraga (1396 Beiträge) am Freitag, 27.Juni.2003, 16:11.
    Re: kleines Sortierproblem:

      Im Prinzip stimmt das, man kann ein hash nicht im ganzen sortieren. (man hat überhauptkeine kontrolle darüber in welcher reihenfolge ein hash ausgegeben wird)

      Man kann aber die Schlüssel in einer Liste sortiert speichern und mit dieser Liste das Hash ab arbeiten. (wie ich es oben gemacht haben)


      Etwas komplizierter wird es wenn du nach der Anzahl und nicht nach den Namen sortieren möchtest. Ist aber auf jeden fall auch möglich. (nur wenn ich das dir jetzt asuwendig sagen würde, währe es eh beim ersten mal sowieso falsch *g* Müsst ich mal probieren)

      Aber vieleicht weiss das jemand anderes jetzt auf anhieb?

     Antworten

    Beitrag von hempelr (1976 Beiträge) am Freitag, 27.Juni.2003, 16:25.
    Re: kleines Sortierproblem:

      ähm Pouraga, du alter Fuchs - jetzt hab ich erst den Term while(get_next("db")){$Kunden{$Kundenname}++;} begriffen - mhm Perl ist halt immer wieder für Überraschungen gut....
      Würde es aber nicht noch günstiger sein, gleich im get "vorzusortieren" über
      get "Kundenname=*","db"; 
      
      (dachte da wär mal n Beitrag von CB diesbezüglich gewesen)?
      Ruben

     Antworten

    Beitrag von Pouraga (1396 Beiträge) am Freitag, 27.Juni.2003, 16:38.
    Re: kleines Sortierproblem:

      Naja schaden tut es nicht, aber helfen auch nicht. *g*

      Hash werden intern irgendwie gespeichert. Scheinbar zufällig aber zugunsten der Effizienz beim abrufen schon sinvoll (für Perl).

      Wenn man sie in einer Schleife durchläuft werden sie nicht in der Reihenfolge ausgegeben wie man sie anlegt.

     Antworten

    Beitrag von H.Fehde (724 Beiträge) am Freitag, 27.Juni.2003, 19:50. WWW: bei123.de
    Re: kleines Sortierproblem: so gehts

      Kleine Routine
      <perl>
      get "Kundenname==*","Kunden";
      my %summe;
      while(get_next("Kunden"))
      {
      $summe{$Kundenname}+=$Betrag;
      }
      foreach my $key (sort {$summe{$a} <=> $summe{$b}} keys %summe)
      {
      out "$key : $summe{$key}<br>";
      }
      out "<hr>";
      </perl>
      

      H.Fehde

     Antworten


     
 Liste der Einträge von 36750 bis 36900:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.06s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!