窗口函數(shù)中RANGE BETWEEN和ROWS BETWEEN的區(qū)別
一、示例數(shù)據(jù)
二、核心區(qū)別
1. RANGE BETWEEN:按邏輯值范圍篩選
SQL語句:
SELECT product, transaction_time, amount, SUM(amount) OVER ( PARTITION BY product ORDER BY transaction_time RANGE BETWEEN INTERVAL 2 DAY PRECEDING AND CURRENT ROW ) AS range_sum FROM transaction_detail;
執(zhí)行結(jié)果:
|
product |
transaction_time |
amount |
range_sum |
|
|
華為 |
2018-01-01 00:00:00 |
5000 |
5000 |
(僅當(dāng)天) |
|
華為 |
2018-01-02 00:00:00 |
4800 |
9800 |
(01-01 至 01-02) |
|
華為 |
2018-01-03 00:00:00 |
5000 |
14800 |
(01-01 至 01-03) |
|
華為 |
2018-01-05 00:00:00 |
6500 |
19500 |
(01-03 至 01-05,自動(dòng)跳過 01-04) |
|
華為 |
2018-01-05 00:00:00 |
8000 |
19500 |
(與上一行范圍相同) |
|
華為 |
2018-01-06 00:00:00 |
5600 |
20100 |
(01-04 至 01-06,自動(dòng)跳過 01-04) |
2. ROWS BETWEEN:按物理行號(hào)篩選
SQL語句:
SELECT product, transaction_time, amount, SUM(amount) OVER ( PARTITION BY product ORDER BY transaction_time ROWS BETWEEN 2 PRECEDING AND CURRENT ROW ) AS rows_sum FROM transaction_detail ;
執(zhí)行結(jié)果:
|
product |
transaction_time |
amount |
rows_sum |
|
|
華為 |
2018-01-01 00:00:00 |
5000 |
5000 |
(僅當(dāng)前行) |
|
華為 |
2018-01-02 00:00:00 |
4800 |
9800 |
(前 1 行 + 當(dāng)前行) |
|
華為 |
2018-01-03 00:00:00 |
5000 |
14800 |
(前 2 行 + 當(dāng)前行) |
|
華為 |
2018-01-05 00:00:00 |
6500 |
16300 |
(前 2 行 + 當(dāng)前行) |
|
華為 |
2018-01-05 00:00:00 |
8000 |
19500 |
(前 2 行 + 當(dāng)前行) |
|
華為 |
2018-01-06 00:00:00 |
5600 |
20100 |
(前 2 行 + 當(dāng)前行) |
三、應(yīng)用場(chǎng)景對(duì)比
|
場(chǎng)景 |
RANGE BETWEEN 適合 |
ROWS BETWEEN 適合 |
|
計(jì)算近 7 天銷售額 |
? 自動(dòng)跳過無交易的日期(如周末) |
? 若周末無數(shù)據(jù),會(huì)導(dǎo)致行偏移錯(cuò)誤 |
|
計(jì)算移動(dòng)平均(3 行) |
? 可能包含不連續(xù)日期的數(shù)據(jù) |
? 嚴(yán)格按連續(xù) 3 行計(jì)算,不考慮日期間隙 |
|
處理重復(fù)日期 |
? 自動(dòng)合并同一日的所有交易 |
? 逐行計(jì)算,可能導(dǎo)致重復(fù)累加 |
四、總結(jié)
|
特性 |
RANGE BETWEEN |
ROWS BETWEEN |
|
范圍依據(jù) |
邏輯值(如日期、數(shù)值)的差值 |
物理行號(hào)的偏移量 |
|
處理日期間隙 |
自動(dòng)忽略無數(shù)據(jù)的日期 |
嚴(yán)格按行號(hào)計(jì)算,不受日期影響 |
|
處理重復(fù)值 |
合并同一邏輯值的所有行 |
逐行處理,不合并 |
|
典型場(chǎng)景 |
按時(shí)間范圍統(tǒng)計(jì)(如近 7 天銷量) |
固定行數(shù)的滑動(dòng)窗口(如移動(dòng)平均) |
選擇哪種方式取決于你的數(shù)據(jù)特性和統(tǒng)計(jì)需求:若需按實(shí)際時(shí)間范圍統(tǒng)計(jì),用 RANGE;若需固定行數(shù)的計(jì)算,用 ROWS。
本文來自博客園,作者:業(yè)余磚家,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/yeyuzhuanjia/p/18909576

浙公網(wǎng)安備 33010602011771號(hào)