pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Greg Stark <gsstark@mit.edu>
To: Ding Xiangguang <Xiangguang@singtel.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: view of weekly data
Date: 18 Feb 2006 02:36:25 -0500
Message-ID: <87hd6x15l2.fsf@stark.xeocode.com> (raw)
In-Reply-To: <543CACD7FF1C4F4AB587CC0864E94EC603B5E31D@EMHQ05B.singtel.corp.root>
References: <543CACD7FF1C4F4AB587CC0864E94EC603B5E31D@EMHQ05B.singtel.corp.root>

"Ding Xiangguang" <Xiangguang@singtel.com> writes:

> Hi, friend,
> 
> Suppose there is table of daily transaction data with 5 fields,
> 
> time(date), open(float8), high(float8), low(float8), close(float8)
> 
> Is it possible to create a view of weekly data, i.e. open is the first
> day'open, high is the highest of the week, low is the lowest of the week, close
> is the last day's close.

low and high are easy, they're just min() and max(). so you would get
something like:

select date_trunc('week', time) as startofweek, 
       min(low) as weeklylow, 
       max(high) as weeklyhigh
  from dailydata
 group by date_trunc('week', time)


Unfortunately showing the open and close is much much harder. To get them
efficiently requires a feature set called OLAP that Postgres doesn't have and
isn't likely to get soon.

In Postgres 8.1 (and 8.0?) you could actually write some custom aggregate
functions using RECORD data type to store the earliest and latest time found
so far and the corresponding open and close to get them efficiently. Maybe
someone else would be able to show how to do that, I haven't tried it yet.

The only way to do it in standardish SQL would be with terribly inefficient
subqueries:

select date_trunc('week', time) as startofweek, 
       min(low) as weeklylow, 
       max(high) as weeklyhigh,
       (select open 
          from dailydata as d 
         where date_trunc('week',time)=date_trunc('week',dailydata.time)
         order by time asc
         limit 1
       ) as weeklyopen,
       (select close
          from dailydata as d 
         where date_trunc('week',time)=date_trunc('week',dailydata.time)
         order by time desc
         limit 1
       ) as weeklyclose
  from dailydata
 group by date_trunc('week', time)


-- 
greg




view thread (2+ messages)

Message-ID: <87hd6x15l2.fsf@stark.xeocode.com>
Permalink:  ../87hd6x15l2.fsf@stark.xeocode.com/
Also on:    postgresql.org/message-id/87hd6x15l2.fsf@stark.xeocode.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: gsstark@mit.edu, Xiangguang@singtel.com
  Subject: Re: view of weekly data
  In-Reply-To: <87hd6x15l2.fsf@stark.xeocode.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