用一份含并列值的数据,对比ROWS和RANGE两种窗口frame边界,看它们只有在遇到并列值时才真实浮现出来的差异。
代码-- score列:10,10,20,20,30,真实存在并列值 SELECT id, score, SUM(score) OVER (ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rows_frame, SUM(score) OVER (ORDER BY score RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS range_frame FROM frame_test;
id score rows_frame range_frame 1 10 10 20 2 10 20 20 ← 两个score=10的行,range_frame真实相同 3 20 40 60 4 20 60 60 ← 两个score=20的行,range_frame真实也相同 5 30 90 90
rows_frame真实老老实实按物理行的顺序逐行累加:10、20、40、60、90,每一行都比上一行真实多加了自己的score。range_frame真实完全不同:两个score=10的行(id=1和id=2),range_frame真实都是20——因为RANGE的边界不是按"第几行"划的,是按ORDER BY的值划的,所有score值相同的行(这类"值相同的行"在窗口函数里真实叫peer行)会被当成真实同一个逻辑边界,一起被包含进当前frame。
每一步都是本文上面用真实窗口函数查询跑出来的原始结果。
ROWS BETWEEN ... vs RANGE BETWEEN ...