Skip site navigation (1) Skip section navigation (2)

Re: Spécifier un premier élément dans une clause select... order by

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
Subject: Re: Spécifier un premier élément dans une clause select... order by
Date: 2009-12-15 17:06:19
Message-ID: 200912151806.19118.guillaume@lelarge.info (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Le mardi 15 décembre 2009 à 17:09:53, Denis Bitouzé a écrit :
> Le mardi 15/12/09 à 16h41,
> Guillaume Lelarge <guillaume(at)lelarge(dot)info> a écrit
> 
> > Le mardi 15 décembre 2009 à 16:31:47, Denis Bitouzé a écrit :
> > > Le mardi 15/12/09 à 16h23,
> > >
> > > Guillaume Lelarge <guillaume(at)lelarge(dot)info> a écrit :
> > > > Ceci devrait le faire :
> > > >
> > > > SELECT * from etu order by id_etu >= 300, id_etu;
> > >
> > > Ne serait-ce pas plutôt :
> > >
> > > SELECT * from etu order by nom_etu,id_etu >= 300;
> >
> > Si tu fais ça, tu auras un tri par les noms en premier.
> 
> Euh... Avec :
> 
> SELECT * from etu order by id_etu >= 300, id_etu;
> 
> j'ai tous les enregistrements, y compris d'id_etu < 300 et classés par
> ordre sur les id_etu.
> 
> > > que tu voulais dire ? Mais ça ne fonctionne dans aucun des cas : les
> > > id_etu < 300 ne sont pas omis.
> >
> > Ton histoire n'est pas claire.
> 
> J'en ai conscience :)
> 
> > Tu veux trier par la colonne id_etu ou filtrer ?
> 
> Comme précisé à Jean-Christophe, je souhaite :
> 
> 1. d'abord effectuer le tri sur les noms et prénoms
> 2. ensuite tronquer le résultat en n'y faisant pas figurer ceux dont
> l'id_etu est < 300.
> 
> > Si tu veux omettre les id_etu < 300, faut le mettre dans la clause
> > WHERE :
> >
> >   SELECT * from etu where id_etu >= 300 order by nom_etu;
> 
> Oui, mais ça, ça effectue les opérations dans l'ordre inverse :
> 
> 1. d'abord ça élimine les id_etu < 300 ;
> 2. ensuite ça trie.
> 
> Et j'ai besoin de l'inverse.
> 
> Pour être plus clair, voici un exemple :
> 
> CREATE TABLE test (
>     id_etu integer NOT NULL,
>     nom_etu text NOT NULL,
>     prenom_etu text NOT NULL
> );
> 
> COPY test (id_etu, nom_etu, prenom_etu) FROM stdin;
> 1	Newton	Isaac
> 2	Einstein	Albert
> 3	Descartes	René
> 4	Galois	Évariste
> \.
> 
> Je souhaite trier par ordre alphabétique :
> 
> SELECT * from test order by nom_etu ,prenom_etu;
>  id_etu |  nom_etu  | prenom_etu
> --------+-----------+------------
>       3 | Descartes | René
>       2 | Einstein  | Albert
>       4 | Galois    | Évariste
>       1 | Newton    | Isaac
> (4 lignes)
> 
> mais en ne faisant commencer cette liste qu'à Einstein (id_etu >=2), de
> façon à obtenir :
> 
>  id_etu |  nom_etu  | prenom_etu
> --------+-----------+------------
>       2 | Einstein  | Albert
>       4 | Galois    | Évariste
>       1 | Newton    | Isaac
> 

Oh, je crois avoir compris ce que tu veux. Tu ne veux pas filtrer avec 
id_etu>=2, mais tu veux conserver toutes les lignes à partir de celle qui a 2 
pour id_etu.

J'obtiens à peu près ça avec une fonction Window (Donc 8.4 obligatoirement):

SELECT id_etu, nom_etu, prenom_etu
FROM
  (SELECT *, row_number() OVER (ORDER BY nom_etu, prenom_etu)
   FROM test
   ORDER BY nom_etu, prenom_etu) AS t
WHERE row_number>=2;

 id_etu | nom_etu  | prenom_etu 
--------+----------+------------
      2 | Einstein | Albert
      4 | Galois   | Évariste
      1 | Newton   | Isaac
(3 lignes)

Mais bon, c'est triché.

Pour les versions antérieures à la 8.4, le plus simple est d'utiliser une 
procédure stockée.


-- 
Guillaume.
 http://www.postgresqlfr.org
 http://dalibo.com

In response to

Responses

pgsql-fr-generale by date

Next:From: Denis BitouzéDate: 2009-12-15 17:20:22
Subject: Re: Spécifier un premier élément dans une clause select... order by
Previous:From: Denis BitouzéDate: 2009-12-15 16:09:53
Subject: Re: Spécifier un premier élément dans une clause select... order by

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group