Frage zu SQL

From: Andreas Kretschmer <akretschmer(at)despammed(dot)com>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Frage zu SQL
Date: 2005-07-04 14:12:23
Message-ID: 20050704141223.GJ14822@webserv.wug-glas.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hi,

ich habe eine Tabelle:

test=# \d konten
Table "public.konten"
Column | Type | Modifiers
--------+-----------------------------+---------------
kunde | bigint | not null
ts | timestamp without time zone | default now()
typ | character(1) | not null
wert | numeric(10,2) | not null
text | character varying |
Indexes:
"idx_konten_kunde" btree (kunde)
"idx_konten_ts" btree (ts)
Check constraints:
"konten_typ_check" CHECK (typ ~ '[KD]'::text)
Foreign-key constraints:
"konten_kunde_fkey" FOREIGN KEY (kunde) REFERENCES kunden(id)

Dort will ich Zu/Abbuchungen speichern, mit typ 'K' für zubuchen, 'D'
abbuchen.

select a.kunde, case when a.typ = 'K' then a.wert when a.typ = 'D' then NULL END as kredit,
case when a.typ = 'K' then NULL when a.typ = 'D' then a.wert END as debit,
a.ts,
sum(get_saldo(a.typ, a.wert))
from konten a, konten b
where b.ts <= a.ts
group by a.kunde, kredit, debit, a.ts
order by a.ts;

Das get_saldo(a.typ, a.wert) ist ne kleine Hilfsfunktion, die den wert
negiert, wenn typ='D' ist.

Ich hab mal ein paar Testdaten reingeworfen und obiges SELECT gemacht:

kunde | kredit | debit | ts | sum
-------+---------+---------+----------------------------+------------
1 | | 2378.61 | 2002-10-13 16:08:44.342253 | -2378.61
1 | | 7785.63 | 2003-01-31 15:08:44.342253 | -15571.26
1 | | 8442.49 | 2004-02-14 15:08:44.342253 | -25327.47
1 | 6599.12 | | 2004-03-01 15:08:44.342253 | 26396.48
1 | 8478.31 | | 2004-06-16 16:08:44.342253 | 42391.55
1 | 1865.92 | | 2004-07-09 16:08:44.342253 | 11195.52
1 | 3271.92 | | 2004-08-09 16:08:44.342253 | 22903.44
1 | 695.64 | | 2004-11-20 15:08:44.342253 | 5565.12
1 | | 2547.23 | 2005-01-14 15:08:44.342253 | -22925.07
1 | 4203.80 | | 2005-02-28 15:08:44.342253 | 42038.00
1 | | 3477.18 | 2005-03-09 15:08:44.342253 | -38248.98
1 | | 8650.23 | 2005-03-23 15:08:44.342253 | -103802.76
1 | | 8460.50 | 2005-03-25 15:08:44.342253 | -109986.50

Klappt. Aber, bei einigen tausen Datensätzen, dauert es *EWIG*. (12000
Sätze, Abbruch nach ca. 1 Stunde warten...)

Wie könnte man das geschickter formulieren, oder ist es generell eine
schlechte Idee, weil ich ja in der letzten Spalte immer das 'davor'
beachten muß?

Andreas
--
Andreas Kretschmer (Kontakt: siehe Header)
Heynitz: 035242/47212, D1: 0160/7141639
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
=== Schollglas Unternehmensgruppe ===

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Peter Eisentraut 2005-07-04 14:27:10 Re: Frage zu SQL
Previous Message Pierre Kerchner 2005-06-29 08:25:07 Suche Postgres Experten aus dem Rhein/Main Gebiet