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

#26 Re : Général » Contrôler la présence des tables importés » 15/06/2020 16:22:46

Oui on peut contrôler la présence de tables ou de champs en SQL pur, mais dès qu'il s'agit de faire une action automatique conditionnée au résultat de ce qu'on a trouvé, le SQL pur ne suffit plus, il faut faire du procédural.

#27 Re : Général » Contrainte UNIQUE mais doublon dans des tables » 30/05/2020 12:41:26

Je ne comprends absolument pas comment s'est possible.

Pour les colonnes de type texte, Il suffit d'avoir le COLLATE basé une locale qui s'appelle pareil mais qui ne trie pas pareil entre le primaire et le secondaire. C'est pourquoi le primaire et le secondaire devraient avoir exactement le même OS dans la même version.

Sur linux il y a une MAJ majeure récente de la libc qui a accru le risque ces derniers temps, cf https://blog-postgresql.verite.pro/2018 … grade.html
quand on ne réindexe pas suite à un upgrade, ou quand le couple (primaire,secondaire) a des versions décalées de la libc.

#28 Re : PL/pgSQL » Requête pour créer une table de variation » 22/05/2020 16:49:25

Effectivement la solution "simple" pour le tri par date ne semble pas faire l'affaire.
Voici une solution différente qui ajoute un étage de requête avec un regroupement intermédiaire par date:

select numero,tableau,unnest(dates) as d,version from
 (select numero,tableau, array_agg(date) as dates, dense_rank() over (partition by numero order by min(date)) as version  
from (select numero,date, array_agg( array[debut,fin] order by debut) as tableau from testdata group by numero,date) AS liste
group by numero,tableau) s
order by numero,d;

cf  https://www.db-fiddle.com/f/o13bBV4hjLWwJYjSiSDLRa/3

#29 Re : PL/pgSQL » Requête pour créer une table de variation » 19/05/2020 15:00:18

Il faudrait reposter l'URL car ça ne doit pas être la même, c'est  versionné.

#30 Re : PL/pgSQL » Requête pour créer une table de variation » 19/05/2020 13:33:06

Je ne sais pas ce qui diffère du résultat attendu.
J'ai mis un test sur db-fiddle ici: https://www.db-fiddle.com/f/o13bBV4hjLWwJYjSiSDLRa/0
Si vous voulez, vous pouvez changer les données de la table avec une série de valeurs qui met en évidence le problème.

#31 Re : PL/pgSQL » Requête pour créer une table de variation » 18/05/2020 19:33:39

Hmm. Le tri par le tableau n'est pas fait pour trier mais pour générer un nouveau rang (dense_rank()) dès que la valeur change dans la même partition. On ne peut pas changer ce tri sans que ça invalide complètement l'idée qui fonde cette requête.

Mais on doit pouvoir influer dans le sens voulu en triant par date la sous-requête "liste", autrement dit:

select liste.*, dense_rank() over (partition by numero order by tableau)
from (select numero,date, array_agg( array[debut,fin] order by debut) as tableau
          from NomDeTable group by numero,date ORDER BY date) AS liste
order by numero, date;

#32 Re : PL/pgSQL » Requête pour créer une table de variation » 15/05/2020 16:27:54

Si ce nombre 3 est fixé par le modèle, ça pourrait être plus simplement des colonnes debut1,fin1,debut2,fin2,debut3,fin3.
Si on considère que le nombre est variable, ça pourrait être un tableau, à une ou deux dimensions.

Par exemple cette requête regroupe en tableau à 2 dimensions:

select numero,date, array_agg( array[debut,fin] order by debut) as tableau
from NomDeTable
group by numero,date;

Après la question du versionnage doit pouvoir être abordée un classement inter-ligne par le tableau.

La requête ci-dessous ne devrait pas être loin de ce qui est cherché:

select liste.*, dense_rank() over (partition by numero order by tableau)
from (select numero,date, array_agg( array[debut,fin] order by debut) as tableau from NomDeTable group by numero,date) AS liste
order by numero, date;

#33 Re : PL/pgSQL » Requête pour créer une table de variation » 15/05/2020 14:58:47

Donc le triplet c'est 3 lignes, et ça c'est compliqué du point de vue relationnel, qui ne gère pas de relations inter-lignes en-dehors des contraintes d'unicité.
Pour pouvoir dire qu'un groupe de 3 lignes est égal ou pas à une autre groupe de 3 lignes, et ça sur toute la longueur de la table, typiquement il faudrait les aggréger pour qu'un triplet devienne une seule ligne.

#34 Re : PL/pgSQL » Requête pour créer une table de variation » 15/05/2020 13:32:06

Peut-être que vous devriez expliquer la logique qui permet d'obtenir la colonne "Variation" parce qu'en regardant juste l'exemple ça n'a rien d'évident.

#35 Re : Général » Requete SELECT step by step » 07/05/2020 11:34:59

Le s donne un nom à la sous-requête; effectivement c'est obligatoire syntaxiquement.
On peut aussi ajouter le mot clef AS pour que ce soit plus lisible, du style:

select .. from ( ...sous-requête...)  AS nom1, (... autre sous-requête...) AS nom2

#36 Re : pgAdmin4 » Modifier l'ordre des colonnes » 06/05/2020 17:15:28

Ca marche aussi si la table est impliquée dans des contraintes d'intégrité référentielle?
Je serais curieux de voir l'ensemble des ordres SQL passés par EMS SQL Manager dans ce cas de figure.

#37 Re : Général » Requete SELECT step by step » 06/05/2020 14:02:35

Rassembler se fait généralement avec GROUP BY. En numérotant les lignes dans un certain ordre on peut grouper sur ce numéro.

Voici un exemple très schématique pour être concret:

1. soit jeu de test avec un timestamp et une valeur

CREATE TEMP TABLE test AS
select
(now()+n*'1 second'::interval)::timestamp(0) as t,
random()*1000 as v
from generate_series(1,10) as n;


select * from test;

          t          |        v         
---------------------+------------------
2020-05-06 13:51:59 | 82.4452051892877
2020-05-06 13:52:00 | 339.041672646999
2020-05-06 13:52:01 | 824.749575462192
2020-05-06 13:52:02 | 717.561565339565
2020-05-06 13:52:03 | 764.736431185156
2020-05-06 13:52:04 | 604.845985304564
2020-05-06 13:52:05 | 82.1709437295794
2020-05-06 13:52:06 | 402.444486506283
2020-05-06 13:52:07 | 747.045868076384
2020-05-06 13:52:08 | 624.612233601511


2. numérote les lignes en partant de 0 dans l'ordre des timestamps. C'est la partie fenêtrage:

select row_number() over(order by t)-1 as rn, t, v from test;


rn |          t          |        v         
----+---------------------+------------------
  0 | 2020-05-06 13:51:59 | 82.4452051892877
  1 | 2020-05-06 13:52:00 | 339.041672646999
  2 | 2020-05-06 13:52:01 | 824.749575462192
  3 | 2020-05-06 13:52:02 | 717.561565339565
  4 | 2020-05-06 13:52:03 | 764.736431185156
  5 | 2020-05-06 13:52:04 | 604.845985304564
  6 | 2020-05-06 13:52:05 | 82.1709437295794
  7 | 2020-05-06 13:52:06 | 402.444486506283
  8 | 2020-05-06 13:52:07 | 747.045868076384
  9 | 2020-05-06 13:52:08 | 624.612233601511



3. regroupe par bloc de 3 lignes consécutives avec la moyenne des valeurs. C'est la partie group by par-dessus le fenêtrage:


select rn/3 as bloc ,avg(v) from (
select row_number() over(order by t)-1 as rn, t, v from test
) s group by rn/3 order by rn/3;


bloc |       avg       
------+------------------
    0 | 415.412151099493
    1 | 695.714660609762
    2 | 410.553766104082
    3 | 624.612233601511

#38 Re : Général » [Problème] Oubli du mot de passe User && Erreur : Port 5432 is already » 06/05/2020 12:49:20

Clairement vous avez deux PostgreSQL avec deux PGDATA indépendants installés:

- un dans /usr/local/var/postgres (typiquement c'est brew qui s'installe là) qui n'est pas démarré
- un dans /Library/PostgreSQL/12/data qui est démarré (typiquement c'est EDB qui s'installe là)

cf https://wiki.postgresql.org/wiki/Installers/Mac_OS_X qui est  un peu datée mais donne une idée des installeurs sur mac.

Le pg_hba.conf à modifier devrait être dans  /Library/PostgreSQL/12/data/pg_hba.conf

Actuellement vous modifiez probablement celui sous /usr/local/...., qui ne sert pas puisque l'instance PG configurée sur ce répertoire ne tourne pas.

#39 Re : Général » [Problème] Oubli du mot de passe User && Erreur : Port 5432 is already » 05/05/2020 21:34:06

Si  lsof -i TCP:5432 ne renvoie rien alors que que le port est en écoute, c'est peut-être un problème de droits.
Je n'ai pas de mac sous la main pour tester, mais sous linux c'est le cas.
Exécuter la commande avec sudo donnerait peut-être un résultat plus fiable.

D'après le résultat de ps il y a bien un postgres qui tourne et vous pouvez vraisemblablement vous connecter avec l'exécutable /Library/PostgreSQL/12/bin/psql

#41 Re : Général » Création d'un tableau analyse croisée avec des valeurs de type "TEXT" » 30/04/2020 13:31:20

Le résultat voulu est un idlocal dans la colonne de gauche, sans répétition d'une ligne à l'autre, et sur chaque ligne  à droite de idlocal 6 colonnes avec les propriétaires correspondants.
Pour ça il faut grouper uniquement par idlocal et utiliser une fonction d'aggrégat pour générer les résultats des 6 colonnes.


C'est ça qui n'est pas intuitivement évident dans les requêtes qui font des tableaux croisés. Bien que logiquement il y ait un seul "ddenom" possible pour un couple (idlocal, ntile) donné, le moteur SQL n'en sait rien. La solution est d'utiliser un aggrégat comme MAX(ddenom). Le max d'une liste d'une seule valeur étant cette valeur, ça convient très bien.

Dans l'idée ce modèle de requête doit marcher (voir la version éditée avec FILTER)

SELECT
  idlocal,
  max(ddenom) FILTER (where ntile = 1) "Nom proprietaire 1",
  max(ddenom) FILTER (where ntile = 2) "Nom proprietaire 2",
... etc pour les autres valeurs...
FROM analyse_complete_test
GROUP BY idlocal;

#42 Re : Général » Mise à jour BD postgres depuis QGIS » 10/04/2020 19:32:26

Au vu de la tentative du 1er message (qui doit générer une erreur sur l'INSERT, alors que l'UPDATE semble correct):

insert into test_importb select * from test_import where test_importb.id_metier_<>test_import.id_metier_;

l'idée est certainement d'insérer dans test_importb les lignes de test_import dont l'id_metier n'est pas déjà dans la destination.

Ca peut s'écrire:

insert into test_importb select * from test_import where 
 NOT EXISTS (select 1 FROM test_importb WHERE test_importb.id_metier_ = test_import.id_metier_);

Sinon on peut aussi écrire l'UPDATE et l'INSERT combinés dans une seule instruction INSERT avec une clause ON CONFLICT DO UPDATE s'il y a une contrainte unique sur id_metier_, mais c'est un peu plus compliqué à écrire.

#43 Re : PL/pgSQL » Renvoyer une valeur 0 pour la fonction Count » 21/02/2020 21:12:38

Il y a 5 colonnes dans cette requête. Autant il est facile d'avoir 0 pour un count(*) quand il n'y a pas de ligne qui correspond (en fait c'est même le comportement de base), autant dans les 4 autres colonnes quelles seraient les valeurs attendues?

N'oubliez pas qu'une vue ou une requête donnée a une seule structure et généralement répond à une seule question.

#44 Re : Site PostgreSQL.fr » ERREUR: syntaxe en entrée invalide pour le type date » 20/02/2020 21:46:20

Vu l'erreur:
"ERREUR:  syntaxe en entrée invalide pour le type date : « Date T »"

La 1ere ligne du fichier ne contient pas de données mais des noms de colonnes.
Dans ce cas il faut ajouter la clause HEADER  à la commande COPY ou \copy pour qu'elle ignore la 1ere ligne.

#45 Re : Général » Modification du nom de la colonne gid » 29/01/2020 18:52:49

Comme la doc le dit ici:

https://docs.postgresql.fr/12/datatype. … ype-serial

SERIAL n'est pas un vrai type de données, le type correspondant  est integer (ou int4 ou int c'est pareil).

Ce qui est important à conserver c'est la clause DEFAULT. C'est elle qui fait le lien avec la séquence créée automatiquement quand on utilise SERIAL.

Au passage psql n'affiche pas serial mais int comme type de colonne:

test=> create table public.test(id serial);
CREATE TABLE
test=> \d public.test
                               Table « public.test »
 Colonne |  Type   | Collationnement | NULL-able |            Par défaut            
---------+---------+-----------------+-----------+----------------------------------
 id      | integer |                 | not null  | nextval('test_id_seq'::regclass)

L'outil que vous utilisez affiche SERIAL probablement en comparant le nom de la séquence avec le nom de la colonne, c'est pourquoi en changeant le nom de la colonne sans changer le nom de la séquence il arrête d'afficher SERIAL.

#46 Re : Sécurité » Quelles pistes pour investiguer une erreur de connexion SSL » 24/01/2020 11:16:37

jdbc:postgresql://localhost:5432/XXXXX?ssl=true&sslmode=disable

D'après https://jdbc.postgresql.org/documentati … lient.html
sslmode=disable est contradictoire avec ssl=true. Pourquoi utiliser cette combinaison d'options?

#47 Re : PL/pgSQL » données supplémentaires après la dernière colonne attendue » 14/01/2020 17:13:36

Avec cette erreur il y a normalement un contexte qui donne le numéro de ligne. Il faudrait regarder la ligne en question.
La raison la plus probable est qu'il y a une occurence du séparateur a l'intérieur d'un champ, que ce champ n'est pas encadré entre guillemets , et que du coup il est compté pour deux champs.
Idéalement il faut produire du vrai CSV, car cette situation n'est pas possible dans un CSV valide quand les règles d'encadrement par guillemets sont respectées, comme décrit dans https://tools.ietf.org/html/rfc4180

#48 Re : Général » event trigger ddl_command_end ne rapporte pas les ordres DROP » 13/12/2019 15:05:30

Le trigger se déclenche probablement mais on ne peut pas accéder aux infos via pg_event_trigger_ddl_commands()
dans le cas des DROP.

Voir https://www.postgresql.org/message-id/f … .gmail.com
pour une discussion récente sur le sujet.

Conclusion: pour les DROP il faut capter l'évènement sql_drop

#49 Re : Général » Problème sur requete UPDATE avec select for update » 06/12/2019 15:28:28

- est-ce que message.id peut changer? est-ce que message.id_queue peut changer?

Cette requête nous l'avons extraite de notre programme et nous l’exécutons manuellement pour la tester et nous arrivons par moment à refaire le problème. Donc les identifiants sont fixés à la main dans la requête et le problème est toujours là

Ce que je voulais dire par un changement c'est plutôt de savoir si pendant que cet UPDATE met à jour is_dequeued il peut y avoir une autre transaction qui chercher à changer le id_queue de la même ligne.

Mais si l'exécuteur utilise l'index unique sur id pour faire l'update et que cet index est corrompu ça pourrait expliquer pourquoi il peut trouver plusieurs lignes correspondant à un même id, c'est pourquoi je pense qu'il faudrait vérifier ça.

#50 Re : Général » postgres 12 - pg_basebackup - syntax changed » 06/12/2019 15:23:04

pg_basebackup: error: could not connect to server: could not translate host name "eidlot2-database-1.pass.lan --username=postgres" to address: Name or service not known

Ca doit venir du fait qu'entre le nom du host et --username, ce n'est pas un caractère ASCII de code 32 (le "vrai" espace) mais un espace insécable ou autre caractère Unicode du style qui produit visuellement la même chose mais qui n'est pas le séparateur attendu. Ca pourrait se vérifier en passant le message d'erreur à la commande hexdump -C.

Pied de page des forums

Propulsé par FluxBB