I am using google bigquery.
I want to find the average number of events for each day of the week (Sunday,monday,tuesday,wednesday,thursday,friday,saturday) for a certain time period (1 to 28 May).
For example there were 4 Sundays between May 1 to May 28, I want to find out average number of events for Sunday based on those 4 Sundays.
Here is my code:
SELECT EXTRACT(DAYOFWEEK FROM TIMESTAMP_MICROS(event_timestamp)) AS day,
AVG(COUNT(*)) AS average_events
FROM `table`
WHERE DATE_TRUNC(EXTRACT(DATE FROM TIMESTAMP_MICROS(event_timestamp)), DAY)
BETWEEN DATETIME('2023-05-01 00:00:00') AND DATETIME('2023-05-28 00:00:00')
GROUP BY day
ORDER BY day
this gives an error like "Aggregations of aggregations are not allowed"
edit:
I have tried the following -
SELECT day,
AVG(counts) AS average_events
FROM (
SELECT EXTRACT(DAYOFWEEK FROM event_timestamp) AS day,
COUNT(*) AS counts
FROM `table`
WHERE DATE_TRUNC(event_timestamp, DAY)
BETWEEN DATETIME('2023-05-01 00:00:00') AND DATETIME('2023-05-28 00:00:00')
GROUP BY day
) AS t
GROUP BY day
ORDER BY day
but here, the count is the same as the average.
You want to aggregate by day first, and get each associated count - then by day of the week.
I would recommend:
Note that I attempted to optimize the
whereclause of the query by filtering directly against original values (we can convert the bounds to unix timestamps instead) - and using half-open intervals.