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

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

From: Denis Bitouzé <dbitouze(at)wanadoo(dot)fr>
To: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Spécifier un premier élément dans une clause select... order by
Date: 2009-12-15 16:09:53
Message-ID: 20091215170953.119fd9de@drums (view raw or flat)
Thread:
Lists: pgsql-fr-generale
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


Les solutions qui m'ont été proposées ne fonctionnent pas :

select * from test where id_etu >=  2 order by nom_etu,prenom_etu;
 id_etu |  nom_etu  | prenom_etu
--------+-----------+------------
      3 | Descartes | René
      2 | Einstein  | Albert
      4 | Galois    | Évariste

J'ai (3 | Descartes | René) non souhaité et pas (1 | Newton    | Isaac)
qui est souhaité. Il en est de même de :

SELECT *
FROM
  (SELECT * FROM test ORDER BY nom_etu, prenom_etu) AS tmp
WHERE id_etu >= 2

Merci !
-- 
Denis



In response to

Responses

pgsql-fr-generale by date

Next:From: Guillaume LelargeDate: 2009-12-15 17:06:19
Subject: Re: Spécifier un premier élément dans une clause select... order by
Previous:From: Guillaume LelargeDate: 2009-12-15 15:50:57
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