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?
这意味着avg(num_trips)不是在所有行上计算,而是在 31 行(最大)上计算 - 15 个相邻行trip_date低于当前行,当前行和 15 个相邻行trip_date大于当前行。当然,当任何一侧的行数少于 15 行时,计算中的行数就会减少。
一个例子:
Run Code Online (Sandbox Code Playgroud)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;价值 | 平均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。
再举一个例子:
Run Code Online (Sandbox Code Playgroud)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
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |