Обсуждение: order by

Поиск
Список
Период
Сортировка

order by

От
Mathieu Arnold
Дата:
Hi

I have :

table a (int, varchar, int)

1 | one   | 1
2 | two   | 3
3 | three | 2
4 | four  | 3
5 | five  | 2

And I would like to select it and sort it so that the 3rd field is first 2, 
then 1 and then 3. so that the result should be :

1 | one   | 1
3 | three | 2
5 | five  | 2
2 | two   | 3
4 | four  | 3

How could I do that ?

-- 
Mathieu Arnold


Re: order by

От
Christoph Haller
Дата:
Try 
select * from a order by 3,1,2; 
Regards, Christoph
> 
> Hi
> 
> I have :
> 
> table a (int, varchar, int)
> 
> 1 | one   | 1
> 2 | two   | 3
> 3 | three | 2
> 4 | four  | 3
> 5 | five  | 2
> 
> And I would like to select it and sort it so that the 3rd field is first 2, 
> then 1 and then 3. so that the result should be :
> 
> 1 | one   | 1
> 3 | three | 2
> 5 | five  | 2
> 2 | two   | 3
> 4 | four  | 3
> 
> How could I do that ?
> 
> -- 
> Mathieu Arnold
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
> 



Re: order by

От
"Marin Dimitrov"
Дата:
----- Original Message ----- 
From: "Mathieu Arnold" 

> then 1 and then 3. so that the result should be :
> 
> 1 | one   | 1
> 3 | three | 2
> 5 | five  | 2
> 2 | two   | 3
> 4 | four  | 3
> 
> How could I do that ?
> 

gate09=# select * from a order by 3,1,2;
c1 |  c2   | c3 
----+-------+---- 1 | one   |  1 3 | three |  2 5 | five  |  2 2 | two   |  3 4 | four  |  3


hth,
   Marin

----
"...what you brought from your past, is of no use in your present. When 
you must choose a new path, do not bring old experiences with you. 
Those who strike out afresh, but who attempt to retain a little of the 
old life, end up torn apart by their own memories. "




Re: order by

От
Mathieu Arnold
Дата:

--On mardi 14 mai 2002 13:49 +0200 Mathieu Arnold <mat@mat.cc> wrote:

> Hi
>
> I have :
>
> table a (int, varchar, int)
>
> 1 | one   | 1
> 2 | two   | 3
> 3 | three | 2
> 4 | four  | 3
> 5 | five  | 2
>
> And I would like to select it and sort it so that the 3rd field is first
> 2, then 1 and then 3. so that the result should be :

next time, I'll reread what I say, the order I want is :

3 | three | 2
5 | five  | 2
1 | one   | 1
2 | two   | 3
4 | four  | 3


-- 
Mathieu Arnold


Re: order by

От
"Joel Burton"
Дата:
> -----Original Message-----
> From: pgsql-sql-owner@postgresql.org
> [mailto:pgsql-sql-owner@postgresql.org]On Behalf Of Mathieu Arnold
> Sent: Tuesday, May 14, 2002 7:50 AM
> To: pgsql-sql@postgresql.org
> Subject: [SQL] order by <something wierd>
>
>
> Hi
>
> I have :
>
> table a (int, varchar, int)
>
> 1 | one   | 1
> 2 | two   | 3
> 3 | three | 2
> 4 | four  | 3
> 5 | five  | 2
>
> And I would like to select it and sort it so that the 3rd field
> is first 2,
> then 1 and then 3. so that the result should be :
>
> 1 | one   | 1
> 3 | three | 2
> 5 | five  | 2
> 2 | two   | 3
> 4 | four  | 3
>
> How could I do that ?

Mathieu --

You're asking to have it be sorted as {2,1,3}, but the sample result data
you give seems to sort by {1,2,3}. Or am I misunderstanding your question?

In any event, some possible solutions:

1) custom function
 CREATE OR REPLACE FUNCTION weird_sort(int) RETURNS int AS ' BEGIN   IF $1=2 THEN     RETURN 1;   ELSIF $1=1 THEN
RETURN2;   ELSE RETURN 3;   END IF; END' LANGUAGE plpgsql;
 
then
 SELECT * FROM a ORDER BY weird_sort(col3);
The nice thing about this is that you could index the result of
weird_sort(col3), so it could perform better.


2) inlined in sql
 SELECT * FROM a ORDER BY CASE WHEN col3=2 THEN 1               WHEN col3=1 THEN 2               ELSE 3           END;


3) union
 SELECT * FROM a WHERE col3=2
 UNION ALL
 SELECT * FROM a WHERE col3=1
 UNION ALL
 SELECT * FROM a WHERE col3=3;


#1 (with index) or #3 might perform better. Test with your data and see.

Joel BURTON | joel@joelburton.com | joelburton.com | aim: wjoelburton
Knowledge Management & Technology Consultant



Re: order by

От
"D'Arcy J.M. Cain"
Дата:
On May 14, 2002 07:49 am, Mathieu Arnold wrote:
> table a (int, varchar, int)
>
> 1 | one   | 1
> 2 | two   | 3
> 3 | three | 2
> 4 | four  | 3
> 5 | five  | 2
>
> And I would like to select it and sort it so that the 3rd field is first 2,
> then 1 and then 3. so that the result should be :
>
> 1 | one   | 1
> 3 | three | 2
> 5 | five  | 2
> 2 | two   | 3
> 4 | four  | 3
>
> How could I do that ?

If I understand what you are asking:

SELECT c3, c2, c1 FROM a ORDER BY c3, c1;

-- 
D'Arcy J.M. Cain <darcy@{druid|vex}.net>   |  Democracy is three wolves
http://www.druid.net/darcy/                |  and a sheep voting on
+1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.


sort text field numerically

От
"Frank Morton"
Дата:
I have a table with a column called "weight" that
is a text field, but in this case, contains float values,
such as ".8" or "0.25". Might also be null.

How can I sort them in numeric order instead of
textual order? Thanks.




Re: order by

От
Mathieu Arnold
Дата:

--On mardi 14 mai 2002 08:05 -0400 Joel Burton <joel@joelburton.com> wrote:

> You're asking to have it be sorted as {2,1,3}, but the sample result data
> you give seems to sort by {1,2,3}. Or am I misunderstanding your question?

you're right, I messed up my example :)
I'll buy the second solution, it's the easier to put on.

> 2) inlined in sql
>
>   SELECT * FROM a
>   ORDER BY CASE WHEN col3=2 THEN 1
>                 WHEN col3=1 THEN 2
>                 ELSE 3
>             END;

-- 
Mathieu Arnold


Re: sort text field numerically

От
"Joel Burton"
Дата:
> -----Original Message-----
> From: pgsql-sql-owner@postgresql.org
> [mailto:pgsql-sql-owner@postgresql.org]On Behalf Of Frank Morton
> Sent: Tuesday, May 14, 2002 8:24 AM
> To: pgsql-sql@postgresql.org
> Subject: [SQL] sort text field numerically
>
>
> I have a table with a column called "weight" that
> is a text field, but in this case, contains float values,
> such as ".8" or "0.25". Might also be null.
>
> How can I sort them in numeric order instead of
> textual order? Thanks.

 select * from floats_table order by text_float_field::float;

will work, as long as there are no non-float items in the table (if there
are, you could use an ORDER BY CASE ... to look for non-numeric characters
and sort these differently, and sort the rest by converting to floats as
::float)

HTH.

Joel BURTON | joel@joelburton.com | joelburton.com | aim: wjoelburton
Knowledge Management & Technology Consultant



Re: order by

От
"Christopher Kings-Lynne"
Дата:
> ----- Original Message -----
> From: "Mathieu Arnold"
>
> > then 1 and then 3. so that the result should be :
> >
> > 1 | one   | 1
> > 3 | three | 2
> > 5 | five  | 2
> > 2 | two   | 3
> > 4 | four  | 3
> >
> > How could I do that ?
> >
>
> gate09=# select * from a order by 3,1,2;

This won't work - it will order by the third param, then first, then
second...

Chris