I have table event
:
event_date,
num_events,
site_id
I can easily use aggregate SQL to do SELECT SUM(num_events) GROUP BY site_id
.
But I also have another table site
:
site_id,
target_date
I'd like to do a JOIN, showing the SUM of num_events
within 60 days of the target_date
, 90 days, 120 days, etc. I thought this could easily be done using a WHERE
clause in the aggregate SQL. However, this is complicated by two challenges:
- The
target_date
is not fixed, but varies for eachsite_id
- I'd like multiple date ranges to be output in the same table; so I can't do a simple
WHERE
to exclude records falling outside the range from theevent
table.
One workaround I've thought of is to simply make several queries, one for each date range, and then use a view to paste them together. Is there a simpler, better, or more elegant way to achieve my goals?
You would do something like:
That is, you can use conditional aggregation. I am not sure what "within 60" days means. This gives days before the target date, but similar logic will work for what you need.
In Postgres 9.4 use the new aggregate
FILTER
clause:Assuming actual
date
data type, so we can simply add / subtractsinteger
numbers for days.Interpreting "within n days" as "+/- n days":
Also add the condition as
WHERE
clause to exclude irrelevant rows early. This should be substantially faster with more than a trivial number of rows outside the scope ofsum_90
inevent
.