pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: scott.marlowe <scott.marlowe@ihs.com>
To: Rasmus Aveskogh <rasmus@defero.se>
Cc: pgsql-sql@postgresql.org
Cc: pgsql-general@postgresql.org
Subject: Re: [SQL] Result set granularity..
Date: Mon, 29 Sep 2003 13:33:24 -0600 (MDT)
Message-ID: <Pine.LNX.4.33.0309291328390.15070-100000@css120.ihs.com> (raw)
In-Reply-To: <59410.193.243.134.6.1064668289.squirrel@www.defero.se>

On Sat, 27 Sep 2003, Rasmus Aveskogh wrote:

> 
> Hi,
> 
> Since I went from Oracle to PostgreSQL I've been missing the "invisable"
> column 'rownum'. I often used it to lower the granularity of my data.
> For example, say I have a large table containing some sort of statistical
> data and want to plot a graph using it.
> If the graph is 600 pixels wide I might as well lower the granularity of
> my incoming data to 600 measure points before plotting.
> 
> In Oracle I used to do this by using the modulus operator on the rownum
> column as a restriction.
> 
> SELECT <column> FROM <table> WHERE mod(rownum, 5) = 0;
> 
> The query above would give me every fifth row of the original result set
> and would save me from sending the data over my database connection and do
> the lowering of the granularity in the application.
> 
> I have two questions, one dependent on the answer on the other one..
> 
> 1) Is it possible to achieve this any other _easy_ way?
> Perhaps it would be feasible to write a wrapper using a counter which
> makes the SELECT and then return every fifth row to the SELECT calling the
> wrapper. But then I assume the data still has to "travel" one step which
> puts on some overhead.

The standard "trick" in Postgresql is to create a temporary sequence and 
select that as well:

create temp sequence aaa;
postgres=# select *, nextval('aaa') from accounts;

to get a row number.  The sequence creation and use is pretty fast, and 
I've used it before.  

> 
> 2) Would it be possible to add one more limit argument to the non-standard
> set of LIMIT and OFFET - a 'SCALE n' or 'GRANUL n' argument which would
> return every n row of the initial result set. I think that would be
> gladly accepted for folks working with statistical data.

Using the same trick, you can get every 5th row like this:

select * from (select *, nextval('aaa') as row from accounts) as a where a.row%5=4;




view thread (6+ messages)

Message-ID: <Pine.LNX.4.33.0309291328390.15070-100000@css120.ihs.com>
Permalink:  ../Pine.LNX.4.33.0309291328390.15070-100000@css120.ihs.com/
Also on:    postgresql.org/message-id/Pine.LNX.4.33.0309291328390.15070-100000@css120.ihs.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: scott.marlowe@ihs.com, rasmus@defero.se, pgsql-general@postgresql.org
  Subject: Re: [SQL] Result set granularity..
  In-Reply-To: <Pine.LNX.4.33.0309291328390.15070-100000@css120.ihs.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox