RE: [pgsql-fr-generale] lié un generate_series et un autre select

From: "Olivier Ducteil" <olivier(dot)ducteil(at)l-olive(dot)fr>
To: "'Bruno Friedmann'" <bruno(at)ioda-net(dot)ch>, <pgsql-fr-generale(at)postgresql(dot)org>
Subject: RE: [pgsql-fr-generale] lié un generate_series et un autre select
Date: 2010-11-03 09:04:42
Message-ID: 003f01cb7b36$28ba75b0$7a2f6110$@l-olive.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Salut tous,

Grâce à toi, je me suis penché un peu plus sur ces nouvelles fonctionnalités.
Elles permettraient de réduire certaines de nos requêtes ; il faut "juste" basculer nos serveurs sur des versions plus récentes de PostgreSQL.
Mais laquelle choisir ?

Pour que la requête soit plus "SQL like", il suffit de créer une séquence, par exemple.

Etape 1
On crée la séquence

CREATE SEQUENCE seq_mes_lignes
INCREMENT 5
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

Etape 2 :
On lance cette requête :

SELECT setval('seq_mes_lignes ',1, true);
SELECT nextval(' seq_mes_lignes ')::numeric(12,4)-1 As numero_ligne, f.* FROM foo f
LIMIT 300;

(on initialise la séquence à chaque requête.)

Bon !
C'est un peu "bourrin", et je n'ose pas tester la charge générée par l'initialisation de la séquence à chaque requête (elle doit être de l'ordre de 50% supplémentaire par rapport à la lecture directe).

Mais c'est une option !
:)
Clair ?

Cordialement
Olivier DUCTEIL

-----Message d'origine-----
De : pgsql-fr-generale-owner(at)postgresql(dot)org [mailto:pgsql-fr-generale-owner(at)postgresql(dot)org] De la part de Bruno Friedmann
Envoyé : mercredi 3 novembre 2010 08:28
À : pgsql-fr-generale(at)postgresql(dot)org
Objet : Re: [pgsql-fr-generale] lié un generate_series et un autre select

Salut Olivier, je suis d'accord, même si ce qui devait être fait, a pu l'être grâce aux nouvelles versions.

Il n'en resterait pas moins intéressant pour "la science" de savoir comment faire cela de manière la plus sql qui soit.

J'avoue n'avoir pas trouvé solution satisfaisante et rapide. Mais je devais très certainement pas partir d'un bon prédicat.

Si l'on résume autrement le pb, il s'agit en fait d'ajouter une colonne issue d'un generate_series au résultat d'une requête avec le premier résultat de la serie collé au premier résultat du subselect, sans pour autant avoir de liens (colonne) entre les deux.

On 11/02/2010 01:37 AM, Olivier Ducteil wrote:
> Bonjour
>
> Fonction "Windows" ne fonctionne qu'à partie de la version 8.4.
> Hic !
> J'en suis resté à la version 8.3.
>
> Superbe fonction !
> Bravo.
>
> Cordialement
> Olivier
>
>
>
> -----Message d'origine-----
> De : pgsql-fr-generale-owner(at)postgresql(dot)org
> [mailto:pgsql-fr-generale-owner(at)postgresql(dot)org] De la part de Cédric
> Villemain Envoyé : lundi 1 novembre 2010 13:00 À : Bruno Friedmann Cc
> : pgsql-fr-generale(at)postgresql(dot)org Objet : [pgsql-fr-generale] Re:
> [pgsql-fr-generale] Re: [pgsql-fr-generale]
> Re: [pgsql-fr-generale] lié un generate_series et un autre select
>
> Le 1 novembre 2010 12:41, Bruno Friedmann <bruno(at)ioda-net(dot)ch> a écrit :
>> On 11/01/2010 12:25 PM, Cédric Villemain wrote:
>>> Le 1 novembre 2010 12:17, Bruno Friedmann <bruno(at)ioda-net(dot)ch> a écrit :
>>>> On 11/01/2010 11:38 AM, Olivier Ducteil wrote:
>>>>> select axe_x.x as p0x, axe_y.y as p0y,
>>>>> axe_x.x-10 as p1x,
>>>>> axe_y.y-10 as p1y,
>>>>>
>>>>> axe_x.x+10 as p2x,
>>>>> axe_y.y-10 as p2y,
>>>>>
>>>>> axe_x.x+10 as p3x,
>>>>> axe_y.y+10 as p3y,
>>>>>
>>>>> axe_x.x-10 as p4x,
>>>>> axe_y.y+10 as p4y
>>>>>
>>>>> from (select generate_series(0, 5000, 5)::numeric(12,4) as x
>>>>> limit
>>>>> 100) axe_x,
>>>>> (select generate_series(0, 5000, 5)::numeric(12,4) as y limit
>>>>> 100) axe_y limit 100
>>>>
>>>> Merci Olivier, mais en fait non ... avec ta requète les valeurs x,y
>>>> sont générés, moi je dois juste "coller" un numéro de kilomètre
>>>> issue du generate_series à une autre requète
>>>>
>>>>
>>>> premier résultat
>>>> x,y,p0x,p0y....
>>>> 2575205.7400;1230076.2300;2575195.7400;1230066.2300;2575215.7400;12
>>>> 3
>>>> 0066.2300;2575215.7400;1230086.2300;2575195.7400;1230086.2300
>>>> 2575205.7800;1230076.0400;2575195.7800;1230066.0400;2575215.7800;12
>>>> 3
>>>> 0066.0400;2575215.7800;1230086.0400;2575195.7800;1230086.0400
>>>> 2575205.8200;1230075.8300;2575195.8200;1230065.8300;2575215.8200;12
>>>> 3
>>>> 0065.8300;2575215.8200;1230085.8300;2575195.8200;1230085.8300
>>>>
>>>> generate
>>>> km
>>>> 0.0000
>>>> 5.0000
>>>> 10.0000
>>>>
>>>> et là c'est très con je veux mettre les km comme première colone du
>>>> précedent résultat
>>>
>>> un exemple précis de la sortie attendue pourrait aider.
>>> Si j'ai bien suivi tu veux quelque chose comme ceci :
>>>
>>> select *, (rank() over (order by id)) * 5::numeric(12,4) from foo;
>>>
>>
>> Bon la freebeer va à Cédric :-)
>
> Yeah !
>
>>
>> Joli le coup de la fonction window ( j'avais ça sur mon plan d'étude
>> pour après pgday.eu )
>
> Oui les WITH et CTE ca simplifie beaucoup de choses.
>
>>
>> Voilà la requète adaptée
>>
>> select (rank() over (order by lid.p0x) ) * 5::numeric(12,4), lid.*
>> from ( select x as p0x, y as p0y,
>> x-10 as p1x, y-10 as p1y,
>> x+10 as p2x, y-10 as p2y,
>> x+10 as p3x, y+10 as p3y,
>> x-10 as p4x, y+10 as p4y
>> from lidar
>> limit 100
>> ) as lid
>>
>
> la requête imbriquée est facultative (le over(order by x) se charge de
> 'ça')
> :
>
> select (rank() over (order by x) ) * 5::numeric(12,4),
> x as p0x, y as p0y,
> x-10 as p1x, y-10 as p1y,
> x+10 as p2x, y-10 as p2y,
> x+10 as p3x, y+10 as p3y,
> x-10 as p4x, y+10 as p4y
> from lidar
> limit 100
>
>> avec les résultats qui vont bien
>>
>> 5.0000;2578034.3700;1231158.6800;2578024.3700;1231148.6800;2578044.37
>> 0
>> 0;1231148.6800;2578044.3700;1231168.6800;2578024.3700;1231168.6800
>> 10.0000;2578034.3900;1231158.4700;2578024.3900;1231148.4700;2578044.3
>> 9
>> 00;1231148.4700;2578044.3900;1231168.4700;2578024.3900;1231168.4700
>> 15.0000;2578034.4100;1231158.2300;2578024.4100;1231148.2300;2578044.4
>> 1
>> 00;1231148.2300;2578044.4100;1231168.2300;2578024.4100;1231168.2300
>> 20.0000;2578034.4300;1231158.0000;2578024.4300;1231148.0000;2578044.4
>> 3
>> 00;1231148.0000;2578044.4300;1231168.0000;2578024.4300;1231168.0000
>> 25.0000;2578034.4800;1231157.9000;2578024.4800;1231147.9000;2578044.4
>> 8
>> 00;1231147.9000;2578044.4800;1231167.9000;2578024.4800;1231167.9000
>>
>> Superbe ...
>>
>>

--

Bruno Friedmann (irc:tigerfoot)
Ioda-Net Sàrl www.ioda-net.ch

--
Sent via pgsql-fr-generale mailing list (pgsql-fr-generale(at)postgresql(dot)org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-fr-generale

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Dimitri Fontaine 2010-11-03 09:16:18 Re: RE: [pgsql-fr-generale] lié un generate_series et un autre select
Previous Message Dimitri Fontaine 2010-11-03 08:45:23 Re: lié un generate_series et un autre select