postgres; zweizeilige Einträge zusammenfassen?

Hi Leutz,
ich habe eine Tabelle mit jeweils zwei Zeilen die zu einer Zeile zusammen gefasst werden sollen.
Bsp.:

     rule_name     |  bytes   | timestmp
-------------------+----------+------------
D Total System   |  210 |  12:00
U Total System   |  100 |  12:00
D Peter          |  210 |  12:00
U Peter          |  100 |  12:00

D Total System   |  410 |  12:15
U Total System   |  200 |  12:15
D Peter          |  410 |  12:15
U Peter          |  200 |  12:15

Der Name besteht aus einen Benutzernamen und einem D für Download und einem U für Upload.
Die ganzen Werte von jedem Benutzer will ich dann in einer neuen Tabelle stündlich in einer Zeile zusammenfassen.
Der neue Timestamp ist einfach die Stunde der einträge, also in diesem Fall fand alles in der Stunde zwischen 12:00 und 13:00 statt

Herauskommen soll dann:

     name     |  bytes_up  | bytes_down   | timestmp
-------------------+----------+------------
Total System   |  300 |  620 | 12:00
Peter          |  300 |  620 | 12:00

Bin jetzt schon soweit, dass ich das ganze in einer neuen Tabelle auslese allerdings noch für Upload und Download jeweils eine Zeile habe.

INSERT INTO hourly (traffic_type, name, bytes, that_time, timestmp )

	SELECT
		SUBSTRING (rule_name FROM 1 FOR 1) AS traffic_type,
		SUBSTRING (rule_name FROM 3 ) AS name,
		sum(bytes) AS bytes,
		now(),
		now()
	FROM logs
	WHERE   
		( 	( SELECT TIMESTAMP WITH TIME ZONE 'epoch' + that_time * INTERVAL '1 second')
			<
			( SELECT('now'::timestamp-interval '10 minutes') )
		)

	GROUP BY rule_name
	ORDER BY name, traffic_type;

Die where Klausel selektiert einfach alle Einträge die bis vor zehn Minuten in der Tabelle standen. außerdem wird da noch der Timestamp ein wenig umgewandelt. Habe das im Beispiel mal etwas vereinfachter dargestellt.

Wie schaffe ich es jetzt den Up und Download jeweils in einer Zeile zusammen zu fügen?

Gruß Sunfy

Vereinfachtes Beispiel:

test=*# select * from transfer ;
   name    | bytes
-----------+-------
 U Peter   |   300
 D Peter   |   200
 U Andreas |   400
 U Andreas |   100
 D Andreas |   200
 U Peter   |   400
 D Peter   |   500
(7 rows)

test=*# select name, sum(upload) as upload, sum(download) as download from (select substring(name, 3,20) as name, sum(case when substring(name,1,1)='U' then bytes else 0 end) as upload, sum(case when substring(name,1,1)='D' then bytes else 0 end) as download from transfer group by name) foo group by name;
  name   | upload | download
---------+--------+----------
 Andreas |    500 |      200
 Peter   |    700 |      700
(2 rows)

Der ‘Trick’ ist das conditionelle CASE WHEN …

Andreas

ah, super.
CASE WHEN
genau danach habe ich gesucht.

Jetzt funktioniert alles wunderbar.
Vielen Dank

Gruß Sunfy