2013-12-10 6 views
1

Мы пытаемся реализовать алгоритм обнаружения пиков с использованием BigQuery. В основном мы хотим отслеживать превышение порогового значения, а затем просто выводить начало и конец времени.Пиковое обнаружение и продолжительность события с использованием BigQuery

Например, с данными о погоде GSOD выберите произвольный температурный порог. В основном для данного местоположения GSOD найдите даты, где он выше 70 градусов, но не учитывайте как событие, пока оно не опустится ниже 70 градусов.

ответ

1

LAG() и LEAD() помогут нам заглянуть в следующую и предыдущую температуру дня. Мы узнаем, что событие началось, когда предыдущий день был ниже 70, а на следующий день закончился. То же, но наоборот, чтобы обнаружить конец.

SELECT day, prevday, temp, nextday, 
    IF((temp>prevday and prevday <70), 'start', 'end') period 
FROM (
    SELECT day, temp, 
    LEAD(temp) OVER(ORDER BY day) nextday, 
    LAG(temp) OVER(ORDER BY day) prevday 
    FROM (
    SELECT year*10000+month*100+day day, mean_temp temp 
    FROM [bigquery-samples:weather_geo.gsod] 
    WHERE station_number = 8404 
) 
) 
WHERE (temp > 70 and prevday < 70 and nextday > 70) 
    OR (nextday < 70 and temp > 70 and prevday>70) 

Результаты:

Row day   prevday temp nextday period 
1 20091009 77.0 74.0 68.7 end 
2 20091013 69.0 72.0 74.8 start  
3 20091016 73.2 70.6 68.9 end 
4 20091029 69.2 72.7 75.3 start  
5 20091106 73.8 72.7 67.6 end 
... 
(2.8s elapsed, 4.53 GB processed) 
Смежные вопросы