On Mon, 2006-09-18 at 14:26 +0100, Gregory Stark wrote:

> And lastly I find the idea of putting attention into OLAP functionality
> interesting. Does anyone have any ideas on where to start with that?

In SQL:2003 the OLAP functionality mostly relies on the concept of
sorted Windows over which "Windowed Aggregates" are defined.

Windows can be defined as 
        ( CURRENT ROW |
         ( UNBOUNDED | n ) PRECEDING )
        [( UNBOUNDED | n ) FOLLOWING]

e.g. 

current situation: 
        CURRENT ROW

running average over last 10 rows
        10 PRECEDING

running total
        UNBOUNDED PRECEDING

The logic is set for the Window and doesn't make much sense to put that
in the aggregate. I imagine that we would do this by allowing the sort
results to be held as an internal cursor, so we can rewind by the
appropriate number. If preceding sort was an external sort, then we use
a tuplestore, modified so that it acts as a fixed-length FIFO queue so
we retain lookback capability.

n FOLLOWING would be emulated by fetching n rows ahead so that the
cursor was set at the correct place before starting calculation.

UNBOUNDED PRECEDING can be handled by caching the output of the last
final function in the query state, so that we do not need to have a
lookback capability at all in that case. (This may need to have an
additional function type definition, since it won't work with all
functions). e.g.

select  val, 
        sum(val) over (order by val rows unbounded preceding) 
from foo;

val     running_SUM_val
1       1               we cache final_func output =1
2       3               =2+1, we then cache it again=3
3       6               =3+3, we then cache it again=6
4       10              =4+6

OLAP is a lot more complex than I've made out, but the only other thing
we need in tuplesort.c to support Windowed aggregates is:
        ORDER BY foo (NULLS FIRST | NULLS LAST)
which we cannot yet specify. 

I'm not planning to work on this just yet, but there's always next year.

-- 
  Simon Riggs             
  EnterpriseDB   http://www.enterprisedb.com


---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to