Re: time series query - Mailing list pgsql-general

From William Garrison
Subject Re: time series query
Date
Msg-id 46110A2A.5040901@mobydisk.com
Whole thread Raw
In response to Re: time series query  (Jaime Silvela <JSilvela@Bear.com>)
Responses Re: time series query  (Jaime Silvela <JSilvela@Bear.com>)
List pgsql-general
Would it speed things up siginficantly if you set the dtval_smaller()
function to be immutable?  Volatile is the default, so it may be
redundantly evaluating things.

Jaime Silvela wrote:
> In case anyone is interested, I was able to solve this, more or less.
> Here's my new "Latest value" query:
>
>  select obj_id, val_type_id, (max(row(observation_date, val))).val
>  from measurements
>  group by obj_id, val_type_id
>
> It was only necessary to define a new (date, numeric) type. Below is the
> code. The performance is actually slower than using a JOIN between the
> table and its  GROUP-BY  version. I guess for performance, I should code
> the functions in C, but at the moment, the value for me is that it
> simplifies a lot of my 12-way join queries!
>
> create type dtval as (
>  dt date,
>  val numeric
> );
>
> create  function dtval_smaller(dtval, dtval) returns dtval as $$
>  select case when $1.dt < $2.dt then $1 else $2 end
> $$ language sql;
>
> create aggregate min (
>  sfunc = dtval_smaller,
>  basetype = dtval,
>  stype = dtval
> );
>
> create  function dtval_larger(dtval, dtval) returns dtval as $$
>  select case when $1.dt > $2.dt then $1 else $2 end
> $$ language sql;
>
> create aggregate max (
>  sfunc = dtval_larger,
>  basetype = dtval,
>  stype = dtval
> );
>
>
>
> Jaime Silvela wrote:
>> The problem I'm trying to solve is pretty standard. I have a table
>> that records measurements of different types at different times.
>>
>> CREATE TABLE measurements (
>>  obj_id int4,
>>  val_type_id int4 references lu_val_type(val_type_id),
>>  val numeric,
>>  observation_date date
>> );
>>
>> I want a query as simple and fast as possible to return the latest
>> observation of each type for each object.
>> I sent a message to this list a while ago, and the suggestion I found
>> to be the best compromise of clarity and speed was:
>> a) create an index on (obj_id, val_type_id, observation_date)
>> b) the "obvious" query becomes fast thanks to the index.
>>    select ms.*
>>    from (
>>        select obj_id, val_type_id, max(observation_date) as
>> observation_date
>>        from measurements
>>       group by obj_id, val_type_id
>>    ) ms_last
>>    join measurements ms using (obj_id, val_type_id, observation_date);
>>
>> It still bugged me a bit that this requires a JOIN, especially since
>> in a procedural language, it would have been so easy to return the
>> value associated with the max(observation_date).
>> I think I've found a pretty good alternative. This at the moment works
>> if we keep track of time with an integer, rather than a date, but it
>> would be readily extensible.
>>
>> The idea is to in fact, associate the value with the
>> max(observation_date) like so:
>> select obj_id, val_type_id, max(array[observation_date, val])
>> group by obj_id, val_type_id;
>>
>> There are two caveats:
>> a) array requires elements to be of the same type, so observation_type
>> must be kept as "time from"
>> b) a row constructor would be ideal here, but there is now max
>> function for rowtypes.
>>
>> If I did have a max() function for row types, it would be clean to do
>> this:
>> select obj_id, val_type_id, max(row(observation_date, val))
>> group by obj_id, val_type_id;
>>
>> Now, it seems that since rowtype comparison is built in, it should be
>> pretty easy to build a max() aggregate for it. Has anybody done this?
>> I'd have looked at the code for max(anyarray) but I don't know how to
>> access it. Can someone point me in the right direction?
>>
>> Also, has someone thought about this before? I'm wondering if there
>> will be a speed gain coming from this.
>>
>> Thank you,
>> Jaime
>>
>>
>> ***********************************************************************
>> Bear Stearns is not responsible for any recommendation, solicitation,
>> offer or agreement or any information about any transaction, customer
>> account or account activity contained in this communication.
>>
>> Bear Stearns does not provide tax, legal or accounting advice.  You
>> should consult your own tax, legal and accounting advisors before
>> engaging in any transaction. In order for Bear Stearns to comply with
>> Internal Revenue Service Circular 230 (if applicable), you are notified
>> that any discussion of U.S. federal tax issues contained or referred to
>> herein is not intended or written to be used, and cannot be used, for
>> the purpose of:  (A) avoiding penalties that may be imposed under the
>> Internal Revenue Code; nor (B) promoting, marketing or recommending to
>> another party any transaction or matter addressed herein.
>> ***********************************************************************
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 3: Have you checked our extensive FAQ?
>>
>>               http://www.postgresql.org/docs/faq
>>
>
>
> ***********************************************************************
> Bear Stearns is not responsible for any recommendation, solicitation,
> offer or agreement or any information about any transaction, customer
> account or account activity contained in this communication.
>
> Bear Stearns does not provide tax, legal or accounting advice.  You
> should consult your own tax, legal and accounting advisors before
> engaging in any transaction. In order for Bear Stearns to comply with
> Internal Revenue Service Circular 230 (if applicable), you are notified
> that any discussion of U.S. federal tax issues contained or referred to
> herein is not intended or written to be used, and cannot be used, for
> the purpose of:  (A) avoiding penalties that may be imposed under the
> Internal Revenue Code; nor (B) promoting, marketing or recommending to
> another party any transaction or matter addressed herein.
> ***********************************************************************
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
>               http://archives.postgresql.org/
>


pgsql-general by date:

Previous
From: Teodor Sigaev
Date:
Subject: Re: to_tsvector in 8.2.3
Next
From: "William Gray"
Date:
Subject: Re: Some encoding trouble via libpq