+ Antworten
Seite 2 von 2 ErsteErste 1 2
Ergebnis 11 bis 20 von 20

Thema: Prozentualer Anteil berechnen

  1. #11
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von Reallo Beitrag anzeigen
    unschoen, aber:

    SELECT ad.adresse, (SELECT COUNT(*) FROM adresse WHERE adresse=ad.adresse) AS gesamt, COUNT(anschlussart) AS anz, 100/(SELECT COUNT(*) FROM adresse WHERE adresse=ad.adresse)::real*COUNT(ad.anschlussart):: real AS prozent, anschlussart FROM
    adresse ad
    GROUP BY ad.adresse, ad.anschlussart
    Okay, ich biete:

    Code:
    select distinct adresse,
                    count(*) over (partition by adresse) as gesamt,
                    count(*) over (partition by adresse,anschlussart) as anz,
                    (100* count(*) over (partition by adresse,anschlussart)::numeric/count(*) over (partition by adresse))::numeric(5,2) as prozent,
                    anschlussart
    from adresse
    order by adresse,
             anschlussart;
    
    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  2. #12
    Reallo ist offline Neuer Benutzer
    Registriert seit
    18.03.2010
    Beiträge
    12

    Standard

    Nachdem ich neugierig bin hab ich unsere Abfragen mal ueber eine "groessere" Tabelle rennen lassen. (Da ich das 'over' auch nicht kannte wollt ichs natuerlich genau wissen). Hab dazu die Tabelle mit dem PgScript gefuellt:

    DECLARE @I, @T; -- Variable names begin with a @
    SET @I = 0; -- @I is an integer
    WHILE @I < 20000
    BEGIN

    INSERT INTO adresse VALUES ('München', 'Analog');
    INSERT INTO adresse VALUES ('München', 'Analog');
    INSERT INTO adresse VALUES ('München', 'Digital');
    INSERT INTO adresse VALUES ('München', 'Sat');
    INSERT INTO adresse VALUES ('München', 'Analog');
    INSERT INTO adresse VALUES ('München', 'Analog');
    INSERT INTO adresse VALUES ('Berlin', 'Digital');
    INSERT INTO adresse VALUES ('Berlin', 'Digital');
    INSERT INTO adresse VALUES ('Berlin', 'Digital');
    INSERT INTO adresse VALUES ('Berlin', 'Sat');
    SET @I = @I + 1;
    END

    Habe das Script dann abbrechen muessen, weil es immer langsamer geworden ist

    Ergebnis mit 26750 Eintraegen:

    mit 'over': 1331 ms, 3859 ms, 2055 ms.
    ohne: 102 ms, 95 ms, 101 ms.

    Hatte mir eigentlich genau das Gegenteil erwartet

  3. #13
    Reallo ist offline Neuer Benutzer
    Registriert seit
    18.03.2010
    Beiträge
    12

    Standard

    wenn man den ersten Typecast (numeric) durch real ersetzt gehts interessanter Weise mindestens doppelt so schnell (976 ms)

  4. #14
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von Reallo Beitrag anzeigen
    Habe das Script dann abbrechen muessen, weil es immer langsamer geworden ist
    Sowas macht man in einer Transaktion. Du hast immer (automatisch) ein COMMIT gemacht, das ist teuer.

    Ergebnis mit 26750 Eintraegen:

    mit 'over': 1331 ms, 3859 ms, 2055 ms.
    ohne: 102 ms, 95 ms, 101 ms.

    Hatte mir eigentlich genau das Gegenteil erwartet
    Gut, müßte man sich mal das EXPLAIN ANALYSE anschauen...

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #15
    Reallo ist offline Neuer Benutzer
    Registriert seit
    18.03.2010
    Beiträge
    12

    Standard

    Deute ich das richtig, dass er die 'over' sequenziell abarbeitet?

  6. #16
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von Reallo Beitrag anzeigen
    Deute ich das richtig, dass er die 'over' sequenziell abarbeitet?
    Ich sehe kein EXPLAIN ANALYSE, was man könnte deuten. Ich sehe ein Script, welches z.B. eine Spalte mit 40% und 60% mit einem gleichen Wert füllt. Dies wird recht sicher immer zu einem Seq-Scan führen. Und ich sehe eine Abfrage ohne WHERE. Erwartest Du ernsthaft, dies ginge ohne einem Seq-Scan?

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #17
    Reallo ist offline Neuer Benutzer
    Registriert seit
    18.03.2010
    Beiträge
    12

    Standard

    ok,
    vielleicht habe ich die Frage falsch gestellt
    Deute ich das richtig, dass er bei meiner Abfrage einige Dinge parallel durchfuehren kann?

    Gerald

  8. #18
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von Reallo Beitrag anzeigen
    ok,
    vielleicht habe ich die Frage falsch gestellt
    Deute ich das richtig, dass er bei meiner Abfrage einige Dinge parallel durchfuehren kann?

    Gerald
    parallel? Nein.

    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #19
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    Danke jungs!

    Code:
    FEHLER:  Syntaxfehler bei »:«
    LINE 1: ... count(*) over (partition by adresse,anschlussart):numeric/c...
    
    Lass ich den Typecast weg geht es.

  10. #20
    akretschmer ist offline Erfahrener Benutzer
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    4.480

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    Danke jungs!

    Code:
    FEHLER:  Syntaxfehler bei »:«
    LINE 1: ... count(*) over (partition by adresse,anschlussart):numeric/c...
    
    Lass ich den Typecast weg geht es.
    Da gehören 4 Punkte hin: je 2 neben- und untereinander ;-)


    Andreas
    --
    Papa-Kind-Kur vom 8. bis 29. September ;-)
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

+ Antworten
Seite 2 von 2 ErsteErste 1 2

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum