Requête SQL "complexe"

Requête SQL "complexe" - SQL/NoSQL - Programmation

Marsh Posté le 02-09-2007 à 22:34:56    

Bonjour,
 
j'aurais bien besoin d'un coup de main pour une requête PgSQL sur laquelle je bloque légèrement.
 
J'ai actuellement une table ayant la forme suivante:

                                           Table "accounting"
     Column     |            Type             |                               Modifiers
----------------+-----------------------------+------------------------------------------------------------------------
 mac_src        | macaddr                     | not null default '00:00:00:00:00:00'::macaddr
 mac_dst        | macaddr                     | not null default '00:00:00:00:00:00'::macaddr
 packets        | integer                     | not null
 bytes          | bigint                      | not null
 stamp_inserted | timestamp without time zone | not null default '0001-01-01 00:00:00 BC'::timestamp without time zone
Indexes:
    "acctounting_pk" PRIMARY KEY, btree (mac_src, mac_dst, stamp_inserted)


 
Pour une adresse MAC donnée, j'aimerais récupérer les traffics entrant et sortant minute par minute.
 
Actuellement, je procède en 3 temps.
Premièrement, je récupère tout le traffic entrant (SUM(packets), SUM(bytes) ... WHERE mac_dst='macaddress') pour cette adresse MAC.
Ensuite, je récupère tout le traffic sortant (SUM(packets), SUM(bytes) ... WHERE mac_src='macaddress') pour cette adresse MAC.
Enfin, via PHP, j'associe ces valeurs en fonction de l'heure.
 
J'aimerais faire ces 3 étapes en une seule et donc obtenir une liste contenant stamp_inserted, SUM(output_packets), SUM(input_packets), SUM(output_bytes) et SUM(input_bytes).
 
Est-ce possible ?
Est-ce plus efficace que ma méthode actuelle ?
 
Merci d'avance.

Reply

Marsh Posté le 02-09-2007 à 22:34:56   

Reply

Marsh Posté le 03-09-2007 à 09:28:18    

SELECT SUM(packets) , timestamp/60 as minute  
FROM accounting
WHERE mac_dst='macaddress'
GROUP BY minute
 
ne connaissant pas les operateur de gestion de date en PGSQL , j'ai fait dnas le sale : timestamp est le nombre de secondes, donc timestamp/60 est le nombre de minutes
 
par contre, vu la structure de ta table il va etre difficile d'avoir les entree et les sorties d'un coup  

Reply

Marsh Posté le 03-09-2007 à 10:09:24    

syntaxe oracle :
 

Code :
  1. SELECT to_char(stamp_inserted, 'MI') minutes, sum(decode(mac_src, 'taval', packets, 0)) packets_inpout, sum(decode(mac_src, 'taval', bytes, 0)) bytes_outpout, sum(decode(mac_dts, 'taval', packets, 0)) packets_outpout, sum(decode(mac_dts, 'taval', bytes, 0)) bytes_outpout
  2. FROM trucmuch
  3. WHERE mac_src = 'taval' OR mac_dst = 'taval'
  4. AND to_number(to_char(stamp_inserted, 'H24')) = heuredésirée
  5. GROUP BY to_char(stamp_inserted, 'MI')


Message édité par MagicBuzz le 03-09-2007 à 10:11:43
Reply

Marsh Posté le 05-09-2007 à 18:17:47    

Merci MagicBuzz, j'ai pu adapter à PostgreSQL.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed