PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#76 Re : Général » nb de personne par jour » 21/01/2011 16:30:08

meles a écrit :

Si je veux tester le 03/01/2011, je fais comment ?

execute test('03-01-2011')

La prochaine fois, je commencerais par lire la doc :-)

#77 Re : Général » nb de personne par jour » 21/01/2011 16:19:10

Marc Cousin a écrit :

PREPARE test (date) as
SELECT sum(case when $1=depart then 0.5 when $1=arrivee then 0.5 when ($1 > arrivee and $1 < depart) then 1 else 0 end) from essai;

Marc, je suis largué là !
Comment j'utilise ça ?

Si je veux tester le 03/01/2011, je fais comment ?

MAN PREPARE pour commencer :-)

Cordialement

#78 Re : Général » nb de personne par jour » 21/01/2011 16:14:37

gleu a écrit :

Pouvez-vous expliquer un peu plus votre problème ? par exemple en donnant un exemple de données en entrée, ainsi qu'en sortie pour chaque question.

Bien sur:

insert into essai values ('dupont','01-01-2011','10-01-2011');
insert into essai values ('dupond','05-01-2011','12-01-2011');
insert into essai values ('durand','07-01-2011','09-01-2011');

pb 1 : Si je veux savoir combien il y a de client présent le 3/1/2011, je devrais trouver 1 (pour le 8/1/2011, il y en a 3)

pb 2 : sur une periode donné, je cherche a obtenir un truc du genre:

2011-01-01 | 1
2011-01-02 | 1
2011-01-03 | 1
2011-01-04 | 1
2011-01-05 | 2
2011-01-06 | 2
2011-01-07 | 3
2011-01-08 | 3
etc...

pb 3 : idem 2 mais :

2011-01-01 | 0.5
2011-01-02 | 1
2011-01-03 | 1
etc...

Je ne suis pas certain dêtre plus clair !

#79 Re : ODBC » Plantage du pilote ODBC lors de requêtes depuis ACCES - "appel échoué" » 21/01/2011 16:04:14

f.ravel a écrit :

Bonsoir,
Je viens d'essayer le code proposé mais ça ne fonctionne pas. Il est aussi fort probable que je fasse des erreurs. Je vais retenter tout de même.

Bonjour, peux tu préciser comment ça ne fonctionne pas ? message d'erreur ? ou autre ?

Si je suis ton raisonnement, tu veux connaitre pour chaque ligne de fd_mobpro_2006 la zone urbaine attaché au champ "DCLT"
et celle attaché au champ "commune".

La correspondance zone urbaine <-> code commune se trouve dans la table "communes_fr_rgpt"

Qu'est ce qu'IPONDI ?

Cordialement

#80 Général » nb de personne par jour » 20/01/2011 18:27:37

meles
Réponses : 23

Bonjour,
  soit une une table de ce style :

 create table essai (
  identifiant varchar,
  arrivee date, 
  depart date);

Comment faire pour connaitre le nb d'identifiant présent un jour donné ?
Sur une période donnée ?
Et si on veut que le jour d'arrivée compte pour 1/2 et celui de départ aussi ?

Bref encore des manipulations de date pas simple à mon gout. J'ai bien fait des essais avec "overlaps" mais ça ne m'a mené nulle part.

Merci d'avance.

#81 Re : ODBC » Plantage du pilote ODBC lors de requêtes depuis ACCES - "appel échoué" » 20/01/2011 18:11:38

Bonjour,
  je trouve cette requête curieuse, j'ai l'impression qu'il y a un produit cartésien entre public_communes_fr_rgpt et public_communes_fr_rgpt_1
à moins que ce soit la notation access qui m'induise en erreur.

Est ce que celle ci marcherai dans psql ?

SELECT
B.Code_AU, C.Code_AU,Sum(A.IPONDI)
FROM fd_mobpro_2006 A
INNER JOIN communes_fr_rgpt B ON B.code_insee = A.DCLT
INNER JOIN communes_fr_rgpt C ON B.code_insee = A.commune
WHERE B.Code_AU not in ('999','000')
  AND C.Code_AU not in ('999','000')
GROUP BY B.Code_AU, C.Code_AU;

Cordialement

#82 Re : Général » Questions générales de newbie » 18/01/2011 12:27:46

Bonjour confrère,
  si tu pars sur une debian, c'est que tu n'est pas novice en unices libres (ta connaissance de cron, rsync renforcent cette hypothèse). Tu n'auras donc aucun mal à gérer une base postgresql dessus (puisqu'il y a des paquets pour l'installation, reste à voire la version packagée par défaut pour debian).

Cordialement

#83 Re : Général » Ajouter une ligne total en fin de select » 13/01/2011 16:34:33

Bonjour, il me semble qu'avant la 9, il etait de bon ton de mettre le AS :

 SELECT
*
FROM (
(
 select Organisme.nomOrganisme,
   sum(NombreEmploye.nombre)
 from NombreEmploye, Organisme
 where NombreEmploye.idOrganisme=Organisme.idOrganisme
 group by Organisme.nomOrganisme
)
union
(
 select 'TOTAL' as TOTAL,
   sum(NombreEmploye.nombre)
 from NombreEmploye
)
) AS tmp
ORDER BY tmp.nomOrganisme='total' asc, tmp.nomOrganisme;

sinon, toujours dans le crado:

 SELECT
*
FROM (
(
 select Organisme.nomOrganisme,
   sum(NombreEmploye.nombre)
 from NombreEmploye, Organisme
 where NombreEmploye.idOrganisme=Organisme.idOrganisme
 group by Organisme.nomOrganisme
)
union
(
 select 'TOTAL' as TOTAL,
   sum(NombreEmploye.nombre)
 from NombreEmploye
)
) AS tmp
ORDER BY 2;

Cordialement

#84 Re : Général » Tirage au sort » 07/01/2011 15:51:16

Effectivement, je vois que le temps d'exécution de la requête est long, mais c'est du cas par cas pour tirer une liste de dossier au sort et aller les controler, donc rien de critique en terme de performances.

merci encore à tous

#85 Re : Général » Tirage au sort » 06/01/2011 18:33:52

Bonsoir,
  ça me convient parfaitement en terme de simplicité

Merci beaucoup

#86 Re : Général » Tirage au sort » 06/01/2011 18:05:50

Par nécessairement, c'est pour faire de l'échantillonage occasionel, tirage au sort sans remise.

Faut-il passer par un create function en pl/pgsql ?

#87 Général » Tirage au sort » 06/01/2011 17:55:56

meles
Réponses : 6

Bonjour,
  y'a t-il moyen de demander à postgresql de me renvoyer n lignes au hasard dans une requete (a l'instar de limit ou offset) genre select * from ma_table sample 100 pour récuperer 100 lignes au pif !

Cordialement

#88 Re : Général » Type Money » 05/01/2011 00:34:09

Ok,
   je ne savais pas que déclarer un type numeric du style (50,2) ne prenait pas plus de place q'un (5,2), voila qui m'arrange bien et résoud mes problèmes existentiels (actuellement, mes bases et calculs monétaires se font en centimes d'euros, ce qui me permettait de ne pas m'enquiquiner avec la gestion des décimales (sauf au moment de l'affichage). J'avais également opté pour les centimes pour des raisons de rapidité (le numeric etant réputé "lent").

Pour le type money, il fonctionne nickel en affichage chez moi sous linux (avec pgadmin ou en console avec psql) : conclusion, encore un problème windows.
Vos réponse confirme quand même ce que je subodorai, il est difficile à manipuler par la suite.

Cordialement

#89 Général » Type Money » 04/01/2011 17:33:16

meles
Réponses : 4

Hello,
  je me pose la question de l'utilité du type money par rapport à un numeric par exemple ?
le gros défaut du numeric à mon gout est qu'il faut lui donner une taille (et pas juste le nombre de decimal) (je reverais de pouvoir definir un numeric  comme ça : numeric(,2)

Du coup le type money règlerai partiellement ce soucis.
Mais il m'a l'air plus fastidieux à utiliser (déjà, il s'affiche mal dans ma console avec psql sous windows et pas du tout dans pgadmin (j'ai tenté ça select '1234'::money;, il me retroune une ligne mais je ne vois rien dans ma cellule de résultat (PG 9.0.1 sous windows XP))

Vos avis sur ce type ?

Cordialement

#90 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 17:43:03

damalaan a écrit :

voici quand même mon code :

SELECT 
  tbl_tournee_trn.trn_date_prel, 
  tbl_tournee_trn.trn_tournee, 
  tbl_tournee_trn.trn_usine, 
  tbl_valeur_mg.mg_matricule, 
  tbl_valeur_mg.mg_val,
  tbl_valeur_mg.mg_val - lag (tbl_valeur_mg.mg_val, 1) 
  over (partition by tbl_valeur_mg.mg_matricule
  order by tbl_tournee_trn.trn_date_prel) ecart
FROM 
  tbl_valeur_mg, 
  tbl_tournee_trn
WHERE 
  tbl_tournee_trn.trn_id = tbl_valeur_mg.trn_id ;

encore merci
plus ça va plus j'aime postgreSQL!!

Bonjour, pouquoi ne pas utiliser une jointure de style inner join plutot que la clause where ?

Est ce que :

SELECT 
  tbl_tournee_trn.trn_date_prel, 
  tbl_tournee_trn.trn_tournee, 
  tbl_tournee_trn.trn_usine, 
  tbl_valeur_mg.mg_matricule, 
  tbl_valeur_mg.mg_val,
  tbl_valeur_mg.mg_val - lag (tbl_valeur_mg.mg_val, 1) 
  over (partition by tbl_valeur_mg.mg_matricule
  order by tbl_tournee_trn.trn_date_prel) ecart
FROM 
  tbl_valeur_mg inner join tbl_tournee_trn using (trn_id);

fonctionne ? mieux ?

Cordialement

#91 Re : Général » aide sur requète sql » 20/12/2010 17:47:58

Comme quoi, j'ai bien fait de demander!

Je n'avais pas du tout percuté que ton "1" et "2" devant les "any(array_agg..." était en fait les groupe 1 et 2.
Je pensais que c'était une notation (un peu comme quand on fait un order by 1,2 pour dire d'ordonner sur les deux premières colonnes).

Cette notation inversé est en fait un peu déroutante. On a pas l'habitude de voire la valeur comme premier argument de la condition.

Merci beaucoup

#92 Re : Général » aide sur requète sql » 20/12/2010 15:59:53

Marc Cousin a écrit :

SELECT user_id from test group by user_id having not 1=any(array_agg(group_id)) and not 2=any(array_agg(group_id));

Bonjour Marc,
  est-il possible d'avoir une petite explicaction sur la notation having not 1=any(array_agg(group_id)) and not 2=any(array_agg(group_id)); ?

je découvre array_agg, mais le reste est un peu abscon pour moi.

Cordialement

#93 Re : PL/pgSQL » Date du premier jour correspond à N° de semaine donné en paramètre » 08/12/2010 15:26:47

Effectivement,
  pas la peine de concaténer le '1' pour avoir le premier jour de la semaine.

Je penses qu'on va avoir du mal à faire plus léger :-).
Il n'est même pas utile d'écrire une fonction.

Et en plus ça m'a permis de découvrir les subtilités IYYY et YYYY (on a pas le droit de mélanger de l'iso et du grégorien dans le formatage, donc il a fallu relire la doc et c'est la que j'ai découvert IYYY)

Cordialement

#94 Re : PL/pgSQL » Date du premier jour correspond à N° de semaine donné en paramètre » 08/12/2010 14:02:04

Ooops,
  effectivement , j'avais intégré qu'il fallait donner le premier jour de la semaine pour une date donnée.

Un simple to_date('201001'||'1','IYYYIWID') ou '201001' est "l'année semaine" devrait alors faire l'affaire, non ?

Cordialement

#95 Re : PL/pgSQL » Date du premier jour correspond à N° de semaine donné en paramètre » 08/12/2010 13:46:22

Bonjour,
  attention l'extraction de l'année de la premiere semaine peut poser problême :

exemple :
select extract(year from to_date('2010-01-01','YYYY-MM-DD')) donne 2010 alors qu'il s'agit en fait de la 53 semaine de l'année 2009 d'ou la demande d'isoyear :
select extract(isoyear from to_date('2010-01-01','YYYY-MM-DD')) qui donnera bien 2009

Voila ma (une) solution:

select to_date(extract(isoyear from to_date('2010-01-04','YYYY-MM-DD'))::text||to_char(extract(week from to_date('2010-01-04','YYYY-MM-DD')),'FM09')||'1','IYYYIWID')

select to_date(extract(isoyear from to_date('2010-01-01','YYYY-MM-DD'))::text||to_char(extract(week from to_date('2010-01-01','YYYY-MM-DD')),'FM09')||'1','IYYYIWID')

#96 Re : Général » Soustraire 2 dates » 19/11/2010 20:56:37

Bonsoir,
  pourquoi pas to_date('2009-10-27','YYYY-MM-DD') dans ce cas ?

Le cast suffit-il juste parce que la date est issue d'une colonne typée date dans postgres et que nécessairement, il va la caster correctement ?

Cordialement

#97 Re : Général » Soustraire 2 dates » 19/11/2010 17:45:03

Hello,
  essayes un peu comme ça alors :

Requete = "Select  (entete_ot.date_validation - entete_ot.datemaintenance)::int
       from Entete_OT where etc...


Si la colonne est déclaré comme une date, à mon avis, c'est pas la peine de la re-caster en faisant ::date.

Cordialement

#98 Re : Général » Soustraire 2 dates » 19/11/2010 17:24:52

Marc Cousin a écrit :

PS: le but n'est pas de casser les nouveaux contributeurs, hein… au contraire. On essaye juste d'être aussi précis que possible dans les réponses, histoire que les gens ne repartent pas avec une demi-solution qui a l'air de marcher, comme on le voit malheureusement souvent dans les forums.

Donc ne pas s'offusquer si on a l'air de «repasser derrière vous pour en rajouter». On le fait même entre nous smile

Pas de soucis, Marc, si je lis ce forum c'est pour m'améliorer et je suis pas du style à m'offusquer quand quelqu'un prend la peine de compléter une réponse.

Cela dit, c'est curieux de devoir faire une conversion de dernière minute dans le calcul. A corire que les colonnes "entete_ot.date_validation" et "entete_ot.datemaintenance" d'unisol sont déclaré comme du simple texte au lieu d'être des colonne de type date.


Cordialement

#99 Re : Général » Soustraire 2 dates » 19/11/2010 17:13:29

Bonsoir,
    VB retourne 45 converti en date '13/02/1900' qui est le 45eme jour de l'année 1900.
C'est une plaie fréquente sous excel qui fait la même chose lorsqu'on fait des opération sur des dates, il renvoie une date qu'il faut ensuite reconvertir en nombre standard.

Pour le cast sur la date, je suis on ne peu plus d'accord avec Marc Cousin, le cast ::date est risqué (je m'étais contenté de reprendre l'exemple donné par unisol (paresse quand tu nous tient)).

Cordialement

#100 Re : Général » Soustraire 2 dates » 19/11/2010 16:59:55

Bonjour,
  et en faisant :

Requete = "Select  (entete_ot.date_validation::date - entete_ot.datemaintenance::date)::int
       from Entete_OT where etc...

Est-ce que ça ne résoud pas le pb ?

Cordialement

Pied de page des forums

Propulsé par FluxBB