Vous n'êtes pas identifié(e).
116M de lignes et 2 ou 3 jours pour avoir les résultats ???
Est-il possible d'avoir plus d'infos :
- un explain de la requête (on voit la analyse un autre jour)
- type de serveur (CPU / RAM / ...)
- les éléments de configuration modifiés : select name, setting from pg_settings where source !='default' and source='configuration file';
OK ! ![]()
donc mon jeux de test :
create table the_range(id_the_range integer,dt_deb date, dt_fin date);
insert into the_range values(1,'2014-02-21', '2014-02-25');
insert into the_range values(2,'2014-02-20', '2014-02-22');
insert into the_range values(3,'2014-02-26', '2014-02-27');la requête :
SELECT
t.id_the_range,
dt_deb,
dt_fin,
(
SELECT
count(*)::text || ' : ' || coalesce(string_agg(id_the_range::text,','),'NA')
FROM
the_range
WHERE
t.id_the_range != id_the_range AND
(
(t.dt_deb>=dt_deb AND t.dt_deb<=dt_fin) OR
(t.dt_deb<=dt_deb AND t.dt_fin>=dt_deb)
)
) as count_and_liste_id
FROM
the_range t
ORDER BY 1résultat :
id_the_range | dt_deb | dt_fin | count_and_liste_id
--------------+------------+------------+--------------------
1 | 2014-02-21 | 2014-02-25 | 1 : 2
2 | 2014-02-20 | 2014-02-22 | 1 : 1
3 | 2014-02-26 | 2014-02-27 | 0 : NA
(3 rows)count_and_liste_id -> count = 1 et 2 est l'id qui le chevauche
vu de loin les 2 clause (t.dt_deb>=dt_deb AND t.dt_deb<=dt_fin) OR (t.dt_deb<=dt_deb AND t.dt_fin>=dt_deb) me semblent couvrir tous les cas, mais je peux me tromper !
de ce que je vois :
date_debut | date_fin
-----------------------------
2014-02-21 | 2014-02-25
2014-02-20 | 2014-02-22
2014-02-26 | 2014-02-27la premiere se chevauche avec la seconde et la dernière avec personne.
donc :
date_debut | date_fin
-----------------------------
2014-02-21 | 2014-02-25 -> 1
2014-02-20 | 2014-02-22 -> 1
2014-02-26 | 2014-02-27 -> 0c'est ça ?
désolé, mais je ne comprends pas ![]()
à mon avis, vous allez devoir passer par un procédure stockée maison ...
Il reste juste à remplacer ???NOM_DE_LA_TABLE¿¿¿ par le nom de votre table
SELECT
DATE_TRUNC('hour', new_date), -- date de début
DATE_TRUNC('hour', new_date + INTERVAL '1 hours'), -- date de fin
SUM(raw_value)
FROM
(SELECT
CASE WHEN
DATE_TRUNC('hour', horodate) = horodate THEN horodate - INTERVAL '1 minutes'
ELSE
horodate
END AS new_date,
raw_value
FROM
???NOM_DE_LA_TABLE¿¿¿) AS foo
GROUP BY
1,2
ORDER BY
1;Les données :
test=# select * from pluie;
la_date | val
---------------------+------
2000-01-01 09:00:00 | 0.10
2000-01-01 09:30:00 | 0.20
2000-01-01 09:42:00 | 0.50
2000-01-01 09:54:00 | 0.20
2000-01-01 10:00:00 | 1.00
(5 rows)La requête :
test=# select date_trunc('hour', new_date), date_trunc('hour', new_date + interval '1 hours'), sum(val) from (select case when date_trunc('hour', la_date) = la_date THEN la_date - interval '1 minutes' ELSE la_date END as new_date, val from pluie) as foo group by 1,2 order by 1;
date_trunc | date_trunc | sum
---------------------+---------------------+------
2000-01-01 08:00:00 | 2000-01-01 09:00:00 | 0.10
2000-01-01 09:00:00 | 2000-01-01 10:00:00 | 1.90
(2 rows)C'est ça ?
Pour avoir date début / date fin :
select date_trunc('hour', la_colonne_avec_le_timestamp), date_trunc('hour', la_colonne_avec_le_timestamp) + interval '1 hours', sum(la_colonne_pluie) from votre_table group by 1,2 order by 1;bonjour,
double post ?
double réponse ![]()
select date_trunc('hour', la_colonne_avec_le_timestamp), sum(la_colonne_pluie) from votre_table group by 1 order by 1;Bonjour,
Votre question n'est pas au bon endroit, mais je ne suis pas modérateur ![]()
Sinon :
select date_trunc('hour', la_colonne_avec_le_timestamp), sum(la_colonne_pluie) from votre_table group by 1 order by 1;En gardant votre UNIQUE index (fk1,val1) et en ajoutant une clause WHERE sur fk1 = 1 vous avez un fonctionnement assez proche :
Index sur val1 :
explain analyse SELECT * FROM tt WHERE val1 = '100' ;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Index Scan using idx_tt2 on tt (cost=0.55..4.57 rows=1 width=109) (actual time=0.028..0.028 rows=1 loops=1)
Index Cond: (val1 = '100'::bpchar)
Planning time: 0.074 ms
Total runtime: 0.050 msIndex unique sur fk1 + val1 :
explain analyse SELECT * FROM tt WHERE val1 = '100' and fk1=1;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Index Scan using idx_tt on tt (cost=0.55..4.57 rows=1 width=109) (actual time=0.033..0.034 rows=1 loops=1)
Index Cond: ((fk1 = 1) AND (val1 = '100'::bpchar))
Planning time: 0.098 ms
Total runtime: 0.058 ms
(4 rows)Je ne dis pas que c'est ce qui est le plus propre, mais ça répond à la première question (1) comme l'index composé n'a que des 1 dans sont premier champ peut il etre utilisé ?)
Bonjour,
Pour que PostgreSQL utilise votre index sans avoir à en re-créer un, il suffit de faire un where champ3 = ?? and champ2 = 1
Bonjour,
je n'ai jamais utilisé ces langages dans PG.
Pour PLR : http://www.joeconway.com/plr/ + http://www.joeconway.com/plr/doc/plr-install.html
La dernière version semble compatible avec la 9.3
Pour PLSH : https://github.com/petere/plsh
"You need to have PostgreSQL 8.3 or later ..." donc ça doit être OK
ou attendre la 9.4
: http://michael.otacoo.com/postgresql-2/ … -standbys/
En sus, PG n'offre pas non plus de déclencheurs DDL (se lançant sur un ordre CREATE ALTER ou DROP) contrairement à Oracle ou SQL Server, ce qui aurait permis d'attribuer ces privilèges au moment de la création des objets !
les mises à jour sont disponibles : http://www.postgresql.org/message-id/CA … .gmail.com
et en ajoutant cette ligne dans start-pgmodeler.sh (en validant le chemin) :
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/bernard/Qt5.1.1/5.1.1/gcc_64/libj'ai la même erreur si je ne charge pas certaines variables environnement.
mais tout fonctionne avec après un "source pgmodeler.vars".
Voila le contenu de mon fichier pgmodeler.vars (vous avez juste à modifier la valeur de PGMODELER_ROOT) :
#/bin/bash
# If you have root access you can rename this file to pgmodeler.sh and put it on
# /etc/profile.d (if you system supports this technique).
# If you do not have root access you can change this file and install it
# as a .bashrc or .bash_profile.
# Specify here the full path to the pgmodeler's root directory
export PGMODELER_ROOT="/home/pri/pgmodeler"
export PGMODELER_CONF_DIR="$PGMODELER_ROOT/conf"
export PGMODELER_SCHEMAS_DIR="$PGMODELER_ROOT/schemas"
export PGMODELER_LANG_DIR="$PGMODELER_ROOT/lang"
export PGMODELER_TMP_DIR="$PGMODELER_ROOT/tmp"
export PGMODELER_PLUGINS_DIR="$PGMODELER_ROOT/plugins"
export PGMODELER_CHANDLER_PATH="$PGMODELER_ROOT/pgmodeler-ch"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"$PGMODELER_ROOT"
export PATH=$PATH:$PGMODELER_ROOTSur le WIKI, ils conseillent de créer un fichier SH qui lance pgmodeler. Au final le principe est le même :
http://www.pgmodeler.com.br/wiki/doku.p … y_packages
Bonjour,
Dans le répertoire de pgmodeler, vous devez avoir un fichier à configurer -> pgmodeler.vars
Quand tout est configuré, vous n'avez plus qu'à prendre en compte les variables de ce fichier (en console) :
arthurr:~/pgmodeler$ source pgmodeler.varspuis à exécuter le binaire :
arthurr:~/pgmodeler$ ./pgmodelerBonsoir,
Pour tous les DBA : je viens de lire : http://wiki.postgresql.org/wiki/Nov2013ReplicationIssue
Préparez vous à mettre à jours vos PostgreSQL si vous avec des hot-standby ...
Ici tous nos serveurs sont en 9.2.5 ou 9.3.1, je ne sais pas si nous sommes touchés mais je vais surveiller !
Je l'utilise plus par réflexe que par utilité : si je sais que la donnée à stocker n'a pas besoin de stocker de grande valeur.
A noter :
- il faut parfois caster explicitement dans certaines requêtes
- il semble que le gains en place disque soit dépendant des colonnes adjacentes à la colonne (http://postgresql.1045698.n5.nabble.com … 17850.html)
la taille de stockage.
un smallint = 2 octets
un integer = 4 octets
un bigint = 8 octets
Si vous avez plusieurs ventouses (id 1 et id 2) pour une vanne (id 1), la vanne (id 1) va être compté 2 fois dans le count(v.id).
Avec le distinct, elle ne va être compté qu'une seule fois.
bonjour,
je ne connais pas assez bien votre base, mais un DISTINCT dans le count est peut être suffisant :
SELECT
a.insee AS commune,
count(distinct b.gid) AS nb_vanne,
count(distinct c.gid) AS nb_ventouse
FROM commune a
LEFT JOIN vanne b ON a.insee = b.insee
LEFT JOIN ventouse c ON a.insee = c.insee
WHERE a.insee = '86000'
GROUP BY a.insee ;Bonjour,
vous parlez de vue, mais dans la première requête, vous essayez d'ajouter une colonne à votre table (la syntaxe est fausse quand même).
concernant votre 2ème requête, je n'ai aucune idée de ce que vous avez essayer de faire. ![]()
pour créer une vue toto avec une nouvelle colonne nommée colonne3 qui prend la valeur "yes" (champ texte) :
create view toto as (select *,'yes'::text as colonne3 from votre_table);La doc sur les vues : http://docs.postgresql.fr/9.3/sql-createview.html