wiki:Recette Mise en forme de données

Mise en forme de données à importer dans BD_CONTMIG_NAT

Retour à la page de démarrage ..


Quand vous importez des données historiques stockées sous différentes formes (excel, access ...), les tables de destination dans BD_CONTMIG_NAT sont très souvent les mêmes :

  • opérations de relève de piège ... : t_operation_ope
  • poissons observés : t_lot_lot
  • caractéristiques (taille, poids, stades pigmentaire ...) : tj_caracteristiquelot_car
  • marques et action de marquage : tj_actionmarquage_act, t_operationmarquage_omq, t_marque_mqe
  • fonctionnement des dispositifs de comptage et de franchissement : t_periodefonctdispositif_per


Lors de la mise en forme de vos données, il faut veiller au respect de plusieurs règles :

  • faire des fichiers avec le nombre de colonnes de la table de destination.

  • le calcul de la migration ne se fait que sur les lots, pas sur les échantillons, tout ce qui est caractéristiques individuelles nécessite donc de créer un lot fils auquel les attribuer. C'est le cas ci-dessous du lot 1000 et de ses lots fils 1001 à 1005, chaque lot fils pouvant recevoir plusieurs caractéristiques (ici taille et stade pigmentaire).
  • il est très préférable d'incorporer toutes les données relatives à un lot lors du premier import car si vous devez y revenir, il est obligatoire de se référer au bon numéro de lot, ce qui complique fortement les choses ...


Voici des données fictives (Migration journalière et Tailles / Poids / Stades) et les tables à importer qui en résultent : t_operation_ope, t_lot_lot et tj_caracteristiquelot_car.

source:stacomi/trunk/docs/trac/image229.jpg

Une fois les différentes tables constituées, référez-vous à Recette SQL Imports dans BD_CONTMIG_NAT pour l'importation des données dans BD_CONTMIG_NAT.


Pour l'import des données, un script de recherche de chevauchement des opérations en cas d'erreur lors de l'import :

DROP TABLE IF EXISTS temp_operation;
CREATE TEMP TABLE  temp_operation (
  ope_identifiant serial NOT NULL,
  ope_dic_identifiant integer NOT NULL,
  ope_date_debut timestamp(0) without time zone NOT NULL,
  ope_date_fin timestamp(0) without time zone NOT NULL,
  ope_organisme character varying(35),
  ope_operateur character varying(35),
  ope_commentaires text,
  CONSTRAINT c_pk_ope PRIMARY KEY (ope_identifiant));

   SELECT * FROM temp_operation where (ope_date_debut,ope_date_fin) OVERLAPS (ope_date_debut,ope_date_fin);

SET CLIENT_ENCODING TO 'WIN1252';
 COPY temp_operation FROM 'C:/base/t_operation_ope_MONT2.csv' USING DELIMITERS ';' WITH CSV HEADER NULL AS '';


--DROP FUNCTION chercheoverlaps()
CREATE OR REPLACE FUNCTION chercheoverlaps() RETURNS SETOF text AS
$BODY$
DECLARE
    nbChevauchements    INTEGER    ;
    idope               INTEGER ;
    r                   temp_operation%rowtype;
    resultat           text;
BEGIN
    FOR r IN SELECT * FROM temp_operation
    LOOP
        SELECT COUNT(*) INTO nbChevauchements
                FROM   temp_operation
                WHERE  (ope_date_debut, ope_date_fin) OVERLAPS (r.ope_date_debut, r.ope_date_fin);
                IF (nbChevauchements > 1) THEN
                resultat=r.ope_identifiant;
                -- je vais chercher la deuxième opération incriminée
                SELECT ope_identifiant INTO idope
                        FROM   temp_operation
                       WHERE  (ope_date_debut, ope_date_fin) OVERLAPS (r.ope_date_debut, r.ope_date_fin)
                       AND ope_identifiant<>r.ope_identifiant;
                -- Il existe un chevauchement           
                RAISE NOTICE 'Les dates se chevauchent : premiere operation --->%',resultat;
                RAISE NOTICE 'deuxième opération --->%',idope;
                END IF  ;
         RETURN NEXT r;         
    END LOOP;
    RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' ;


SELECT COUNT(*) FROM chercheoverlaps(); 
Last modified 8 years ago Last modified on Dec 15, 2016 9:39:16 AM