Sql-Server
“前 15 行和後 15 行之間的行”的含義
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
誰能給我解釋一下的意思
rows between 15 preceding and 15 following
?
這意味著
avg(num_trips)
不是在所有行上計算,而是在 31 行(最大)上計算 - 15 個相鄰行trip_date
小於目前行、目前行和 15 個相鄰行trip_date
大於目前行。當然,當任何一側的行數少於 15 行時,計算中的行數就會減少。一個例子:
CREATE TABLE test (value INT); INSERT INTO test VALUES (1), (2), (3), (4), (5), (6);
SELECT value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) avg2 FROM test;
價值 | 平均2 ----: | -----: 1 | 2.0000 2 | 2.5000 3 | 3.0000 4 | 4.0000 5 | 4.5000 6 | 5.0000
讓我們取第 3 行。框架定義我們應該從前面的 2 行到後面的 2 行。第 3 行的“前 2”行是第 1 行,“後 2”是第 5 行。因此
AVG
計算 1 到 5 之間的所有 5 行,平均值為 3。我們以第 2 行為例。第 1 行的“前 2”行是唯一的第 1 行,“後 2”是第 4 行。因此
AVG
計算從 1 到 4 的 4 行,平均值為 2.5。再舉一個例子:
SELECT value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) avg2 FROM test;
價值 | 平均2 ----: | -----: 1 | *空值* 2 | 1.0000 3 | 1.5000 4 | 2.5000 5 | 3.5000 6 | 4.5000
讓我們取第 3 行。框架定義我們應該從前面的 2 到前面的 1 取行。“前2”行是第1行,“前1”是第2行。所以
AVG
從1到2計算2行,平均值為1.5。讓我們以第 1 行為例。“前 2 行”和“前 1 行”都不是。所以沒有行
AVG
計算,輸出為NULL。https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=eac1f05b4df491f2620c196062c2ab37