Обсуждение: Aggregate time data on half hour interval
I am looking for a way to aggregate timestamped data on a half hour
interval, not just by the hour or minute. Suppose I have a table composed
of:
Date | Time | Data
-----------+----------+------
1999-12-19 | 10:00:00 | 76
1999-12-19 | 10:15:00 | 72
1999-12-19 | 10:30:00 | 77
1999-12-19 | 10:45:00 | 71
1999-12-19 | 11:00:00 | 74
1999-12-19 | 11:15:00 | 78
I can aggregate by the hour without problem:
SELECT Date, date_trunc('hour', Time) AS HOUR, SUM(Data)
FROM Table
GROUP BY Date, HOUR;
What I would like to do though is aggregate by each half hour or maybe
even 20 minutes. Does anyone know a good way to do this?
Thanks in advance,
-Lars
Lars <lars@sscsinc.com> writes:
> What I would like to do though is aggregate by each half hour or maybe
> even 20 minutes. Does anyone know a good way to do this?
I don't have a *good* answer, but a brute-force way is
* convert timestamp to integer seconds with date_part('epoch', foo)
* round to a multiple of desired time interval
* convert back to timestamp for display via timestamp()
In the long run it seems like date_trunc ought to be more flexible
than it is...
regards, tom lane
> In the long run it seems like date_trunc ought to be more flexible
> than it is...
Now that we can easily overload built-in functions, we should be able to
have an alternate form for date_trunc() which can do this. Say, by
accepting a double value as the first argument, which would be the
amount to round, in seconds, like this:
date_trunc(20.0, tsfield)
or by adding one more argument which would be the units, like this:
date_trunc('minutes', 20.0, tsfield)
I think I like this second one better.
Or are you proposing something specific for the current date_trunc()?
The current form is modeled on the Ingres function of the same name.
- Thomas
It may be ugly, but it sure works! Here is my query:
SELECT Date, interval(trunc(date_part('epoch', time)/1800) * 1800) AS
HALFHOUR, SUM(Data)
FROM Table
GROUP BY Date, HALFHOUR;
This seems to work great, and I don't see any performance hit either.
Thanks,
-Lars
On Thu, 20 Jul 2000, Tom Lane wrote:
> Lars <lars@sscsinc.com> writes:
> > What I would like to do though is aggregate by each half hour or maybe
> > even 20 minutes. Does anyone know a good way to do this?
>
> I don't have a *good* answer, but a brute-force way is
>
> * convert timestamp to integer seconds with date_part('epoch', foo)
> * round to a multiple of desired time interval
> * convert back to timestamp for display via timestamp()
>
> In the long run it seems like date_trunc ought to be more flexible
> than it is...
>
> regards, tom lane
>
If I wanted to aggregate a date field by week is the answer the same
or can date_trunc do that? A quick check implies no date_trunc...
-Kyle
Tom Lane wrote:
> Lars <lars@sscsinc.com> writes:
> > What I would like to do though is aggregate by each half hour or maybe
> > even 20 minutes. Does anyone know a good way to do this?
>
> I don't have a *good* answer, but a brute-force way is
>
> * convert timestamp to integer seconds with date_part('epoch', foo)
> * round to a multiple of desired time interval
> * convert back to timestamp for display via timestamp()
>
> In the long run it seems like date_trunc ought to be more flexible
> than it is...
>
> regards, tom lane