Re: [despammed] Re: Frage zu SQL

From: Andreas Seltenreich <andreas+pg(at)gate450(dot)dyndns(dot)org>
To: Andreas Kretschmer <akretschmer(at)despammed(dot)com>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: [despammed] Re: Frage zu SQL
Date: 2005-07-04 17:41:30
Message-ID: 87hdfa31v9.fsf@gate450.dyndns.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Andreas Kretschmer schrob:

> am 04.07.2005, um 16:27:10 +0200 mailte Peter Eisentraut folgendes:
>> Ich verstehe die Bedeutung dieser Join-Bedingung b.ts <= a.ts nicht. Das
>> ergibt, und jetzt lehn ich mich mathematisch mal aus dem Fenster, glaub
>> ich N*(N+1)/2 Datensätze, also hier rund 72 Millionen, was bei deiner
>
> ja, kann hinkommen, der explain sagte auch was in dieser Größenordnung.
>
> Also, ich wollte ja die summen bis dahin erfassen, also grob so:
>
> id | wert | summe
> ---------------------
> 1 | 5 | 5 (0+5)
> 2 | 10 | 15 (5+10)
> 3 | -2 | 13 (15-2)

Deine Lösung liegt zwar - wie Peter festgestellt hat - in O(n^2), das
Problem jedoch in O(n). Ich denke aber nicht, daß man mit SQL alleine
da 'ran kommt, da man sich die Summe der letzten Zeile merken müßte.
In Verbindung mit pltcl (oder PL/FOO, wenn's dort ebenfalls Persistenz
gibt) ist es jedoch kein Problem:

--8<---------------cut here---------------start------------->8---
scratch=> create or replace function sum_upto_here(numeric) returns numeric as '
scratch'> upvar GD sum
scratch'>
scratch'> if {[string equal "" $1]} {
scratch'> set sum 0
scratch'> } elseif {![info exists sum] || ![string length $sum]} {
scratch'> set sum $1
scratch'> } else {
scratch'> set sum [expr {$sum + $1}]
scratch'> }
scratch'> return $sum
scratch'> ' language 'pltcl' volatile;
CREATE FUNCTION
scratch=> create table foo (bar int);
CREATE TABLE
scratch=> \copy foo from stdin
1
2
3
\.
scratch=> select bar, sum_upto_here(bar) from foo;
bar | sum_upto_here
-----+---------------
1 | 1
2 | 3
3 | 6
(3 Zeilen)
--8<---------------cut here---------------end--------------->8---

Der Zähler wird hier mit sum_upto_here(NULL) zurückgesetzt, vielleicht
geht das auch noch eleganter?

HTH
Andreas

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Harald Fuchs 2005-07-04 17:57:49 Re: [despammed] Re: Frage zu SQL
Previous Message Peter Eisentraut 2005-07-04 17:39:43 Re: [despammed] Re: Frage zu SQL