I have two tables in BigQuery: one containing the places of road cameras, named cameras
…
x
| city | state | road | mile |
|------|-------|--------|------|
| Abcd | Wxyz | 10101 | 12.3 |
| Efgh | Wxyz | 98765 | 7.8 |
…and another containing accidents, named accidents
.
| date | street | mile |
|-------|--------|------|
| 12-01 | 10101 | 11.9 |
| 12-02 | 10101 | 21.1 |
| 12-02 | 10101 | 12.1 |
| 12-02 | 98765 | 7.1 |
| 12-03 | 98765 | 7.6 |
| 12-03 | 98765 | 5.3 |
I need to inspect how many accidents happened in the range of 0.5 mile before and 0.5 mile after the cameras.
So, what I need to do is:
- Establish a .5-mile perimeter in table named
cameras
; - Check how many accidents in table
accidents
happened in each .5-mile perimeter of tablecameras
.
How can I do that? Any help?
Advertisement
Answer
Below is for BigQuery Standard SQL
#standardSQL
SELECT c.*, accidents_in_perimeter FROM (
SELECT ANY_VALUE(c) AS c, COUNT(1) AS accidents_in_perimeter
FROM `project.dataset.cameras` c
JOIN `project.dataset.accidents` a
ON c.road = a.street
AND a.mile BETWEEN c.mile - 0.5 AND c.mile + 0.5
GROUP BY FORMAT('%t', c)
)
if to apply to sample data from your question – result is
Row city state road mile accidents_in_perimeter
1 Abcd Wxyz 10101 12.3 2
2 Efgh Wxyz 98765 7.8 1