WITH trips_by_day AS
(
SELECT DATE(trip_start_timestamp) AS trip_date,
COUNT(*) as num_trips
FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_start_timestamp >= '2016-01-01' AND trip_start_timestamp < '2018-01-01'
GROUP BY trip_date
ORDER BY trip_date
)
SELECT trip_date,
avg(num_trips)
OVER (
order by trip_date
rows between 15 preceding and 15 following
) AS avg_num_trips
FROM trips_by_day
Alguém poderia me explicar o significado de rows between 15 preceding and 15 following
?
Isso significa que
avg(num_trips)
é calculado não em todas as linhas, mas em 31 linhas (máximo) - 15 linhas adjacentes comtrip_date
menor que na linha atual, linha atual e 15 linhas adjacentes comtrip_date
maior que na linha atual. Obviamente, quando há menos de 15 linhas de qualquer lado, menos linhas são consideradas no cálculo.Um exemplo:
Vamos pegar a linha 3. O quadro define que devemos pegar as linhas de 2 anteriores até 2 seguintes. As "2 linhas anteriores" para a linha 3 são a linha 1, "2 seguintes" é a linha 5. Assim,
AVG
é calculado para todas as 5 linhas entre 1 e 5 inclusive, e a média é 3.Vamos pegar a linha 2. As "2 linhas anteriores" para a linha 1 são a única linha 1, "2 seguintes" é a linha 4. Assim,
AVG
é calculado para 4 linhas de 1 a 4, e a média é 2,5.Mais um exemplo:
Vamos pegar a linha 3. O quadro define que devemos pegar as linhas de 2 anteriores até 1 anterior. A linha "2 anteriores" é a linha 1, "1 anterior" é a linha 2. Assim,
AVG
é calculado para 2 linhas de 1 a 2 e a média é 1,5.Vamos pegar a linha 1. A linha não é "2 precedente" e "1 precedente". Portanto, não há linhas para
AVG
cálculo e a saída é NULL.https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=eac1f05b4df491f2620c196062c2ab37
Esta cláusula especifica/limita as linhas sobre as quais a média dessa linha é calculada.
Na sua consulta
avg_num_trips
encontra-se uma média corrente do número de viagens (num dia), calculada, não sobre todas as linhas, mas apenas sobre o máximo de 31 linhas, nomeadamente as 15 linhas anteriores à data da viagem, a própria linha (linha actual ) e as 15 linhas que seguem a data da viagem.Consulte a documentação: Cláusula SELECT - OVER (Transact-SQL)