Sql-Server

“前 15 行和後 15 行之間的行”的含義

  • May 31, 2021
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

引用自:https://dba.stackexchange.com/questions/292522