“前 15 行和后 15 行之间的行”的含义

kn3*_*n3l -1 sql-server window-functions

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
Run Code Online (Sandbox Code Playgroud)

谁能给我解释一下的意思rows between 15 preceding and 15 following

Aki*_*ina 5

这意味着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);
Run Code Online (Sandbox Code Playgroud)
SELECT value,
       AVG(value) OVER (ORDER BY value ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) avg2
FROM test;
Run Code Online (Sandbox Code Playgroud)
价值 | 平均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 个后续”是第AVG4 行。因此计算从 1 到 4 的 4 行,平均值为 2.5。

再举一个例子:

SELECT value,
       AVG(value) OVER (ORDER BY value ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) avg2
FROM test;
Run Code Online (Sandbox Code Playgroud)
价值 | 平均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