Reputation: 115
I'm having trouble with coming up with a query to find the average age of the buses used for each bus company from the following schema:
buscompany
company_id | name
1 NED
2 JIM
bustype
type_id | date_made
1 2006-01-26
2 1999-05-05
3 2000-09-01
route
route_id | bustype | bus_company
1 2 1
2 1 1
3 1 1
4 3 2
5 3 2
6 1 2
7 2 2
In this example NED's average bus age is 4246.666 = 4247 days assuming today is 2013-03-18.
What would the whole query look like?
Upvotes: 5
Views: 15151
Reputation: 58534
I can't test right now, but something like:
-- assuming "date_made" is a pg DATE column
--
SELECT buscompany.name, ROUND(AVG(CURRENT_DATE - date_made))
FROM buscompany
LEFT JOIN route
ON route.bus_company = buscompany.company_id
LEFT JOIN bustype
ON route.bustype = bustype.type_id
GROUP BY 1
ought to Do What You Want (tm). Date subtraction in pg gives the difference in days.
Upvotes: 3
Reputation: 26574
The following (based on a sample table I made) gave me the average in days.
select extract(day from avg(current_date-birthday)) from stuff;
avg gives you an interval and not the number of days, so I did the extract.
If you want to deal with the interval instead of a number of days then you can do this instead
select avg(age(birthday)) from stuff;
Upvotes: 0