get first and last row in one sql as two columns

Started by Tom Smithover 10 years ago8 messagesgeneral
Jump to latest
#1Tom Smith
tomsmith1989sk@gmail.com

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

I saw some posting in wiki with a custom function (or C extention)
to do this. Is it widely used and reliable?
https://wiki.postgresql.org/wiki/First/last_(aggregate)

I am wondering why these two functions are not part of postgresql built-in
functions as it has many use cases

Thanks

#2Rob Sargent
robjsargent@gmail.com
In reply to: Tom Smith (#1)
Re: get first and last row in one sql as two columns

On 09/02/2015 05:14 PM, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

I saw some posting in wiki with a custom function (or C extention)
to do this. Is it widely used and reliable?
https://wiki.postgresql.org/wiki/First/last_(aggregate)
<https://wiki.postgresql.org/wiki/First/last_%28aggregate%29&gt;

I am wondering why these two functions are not part of postgresql built-in
functions as it has many use cases

Thanks

If you're ordering by col1, does

select min(col1), max(col1) from table order by col1

not do the trick;

#3Rob Sargent
robjsargent@gmail.com
In reply to: Tom Smith (#1)
Re: get first and last row in one sql as two columns

On 09/02/2015 05:14 PM, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

I saw some posting in wiki with a custom function (or C extention)
to do this. Is it widely used and reliable?
https://wiki.postgresql.org/wiki/First/last_(aggregate)
<https://wiki.postgresql.org/wiki/First/last_%28aggregate%29&gt;

I am wondering why these two functions are not part of postgresql built-in
functions as it has many use cases

Thanks

But what I think you are looking for are the windowing functions as what
you propose breaks down pretty quickly with more complicated queries.

#4Melvin Davidson
melvin6925@gmail.com
In reply to: Rob Sargent (#2)
Re: get first and last row in one sql as two columns

Try this:

SELECT
(SELECT <your_column>
FROM <your_table>
ORDER BY <your_column> offset 0 LIMIT 1) ,
(SELECT <your_column>
FROM <your_table>
ORDER BY <your_column> OFFSET (SELECT COUNT(*) ) LIMIT 1)
FROM <your_table> LIMIT 1;

On Wed, Sep 2, 2015 at 7:27 PM, Rob Sargent <robjsargent@gmail.com> wrote:

On 09/02/2015 05:14 PM, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

I saw some posting in wiki with a custom function (or C extention)
to do this. Is it widely used and reliable?
https://wiki.postgresql.org/wiki/First/last_(aggregate)

I am wondering why these two functions are not part of postgresql built-in
functions as it has many use cases

Thanks

If you're ordering by col1, does

select min(col1), max(col1) from table order by col1

not do the trick;

--
*Melvin Davidson*
I reserve the right to fantasize. Whether or not you
wish to share my fantasy is entirely up to you.

#5Tom Smith
tomsmith1989sk@gmail.com
In reply to: Melvin Davidson (#4)
Re: get first and last row in one sql as two columns

Thanks for suggestion. I could use two separate sqls, but I am looking to
get it in a single sql.
I just compiled and installed (under postgres id) first_last_agg C
extension.
http://pgxn.org/dist/first_last_agg/
it WORKED under postgres user with sample
select first(column1), last(column1) from (values (null),(1),(3),(null)) as
x
but somehow when I run under other users, it say

ERROR: function first(integer) does not exist

below is the control file , I can not find out why I can not run under
other user ids.
Any help would be appreciated.

# first_last_agg extension
comment = 'first() and last() aggregate functions'
default_version = '0.1.4'
module_pathname = '$libdir/first_last_agg'
relocatable = false
schema = pg_catalog
superuser = false

On Wed, Sep 2, 2015 at 7:47 PM, Melvin Davidson <melvin6925@gmail.com>
wrote:

Show quoted text

Try this:

SELECT
(SELECT <your_column>
FROM <your_table>
ORDER BY <your_column> offset 0 LIMIT 1) ,
(SELECT <your_column>
FROM <your_table>
ORDER BY <your_column> OFFSET (SELECT COUNT(*) ) LIMIT 1)
FROM <your_table> LIMIT 1;

On Wed, Sep 2, 2015 at 7:27 PM, Rob Sargent <robjsargent@gmail.com> wrote:

On 09/02/2015 05:14 PM, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

I saw some posting in wiki with a custom function (or C extention)
to do this. Is it widely used and reliable?
https://wiki.postgresql.org/wiki/First/last_(aggregate)

I am wondering why these two functions are not part of postgresql built-in
functions as it has many use cases

Thanks

If you're ordering by col1, does

select min(col1), max(col1) from table order by col1

not do the trick;

--
*Melvin Davidson*
I reserve the right to fantasize. Whether or not you
wish to share my fantasy is entirely up to you.

#6Dickson S. Guedes
listas@guedesoft.net
In reply to: Tom Smith (#1)
Re: get first and last row in one sql as two columns

On Wed, Sep 02, 2015 at 07:14:40PM -0400, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

Have you tried the window functions [1]http://www.postgresql.org/docs/current/static/functions-window.html last_value and first_value?

You could use something like:

SELECT first_value(col1) over (order by col1),
last_value(col1) over (order by col1)
FROM table;

It should be as simple as that, or I miss your point.

[1]: http://www.postgresql.org/docs/current/static/functions-window.html

[]s
--
Dickson S. Guedes
@guediz - http://github.com/guedes

#7Tom Smith
tomsmith1989sk@gmail.com
In reply to: Dickson S. Guedes (#6)
Re: get first and last row in one sql as two columns

Hi:

The window function works for me (with adding limit 1 in the end to output
only one row
needed instead of many duplicate rows).

thanks very much.

On Thu, Sep 3, 2015 at 6:51 AM, Dickson S. Guedes <listas@guedesoft.net>
wrote:

Show quoted text

On Wed, Sep 02, 2015 at 07:14:40PM -0400, Tom Smith wrote:

Hi:

I need to get the first and last tow in one sql like below

select first(col1), last(col1) from table order by col1

Have you tried the window functions [1] last_value and first_value?

You could use something like:

SELECT first_value(col1) over (order by col1),
last_value(col1) over (order by col1)
FROM table;

It should be as simple as that, or I miss your point.

[1] http://www.postgresql.org/docs/current/static/functions-window.html

[]s
--
Dickson S. Guedes
@guediz - http://github.com/guedes

#8Thomas Kellerer
spam_eater@gmx.net
In reply to: Tom Smith (#7)
Re: get first and last row in one sql as two columns

Tom Smith schrieb am 03.09.2015 um 14:11:

SELECT first_value(col1) over (order by col1),
last_value(col1) over (order by col1)
FROM table;

The window function works for me (with adding limit 1 in the end to output only one row
needed instead of many duplicate rows).

If that works for you with a LIMIT 1, then I don't understand why

select min(col1), max(col1)
from table

doesn't work for you

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general