【发布时间】:2019-03-09 12:09:09
【问题描述】:
我有架构(Oracle 11g R2):
CREATE TABLE users (
id INT NOT NULL,
name VARCHAR(30) NOT NULL,
num int NOT NULL
);
INSERT INTO users (id, name, num) VALUES (1,'alan',5);
INSERT INTO users (id, name, num) VALUES (2,'alan',4);
INSERT INTO users (id, name, num) VALUES (3,'julia',10);
INSERT INTO users (id, name, num) VALUES (4,'maros',77);
INSERT INTO users (id, name, num) VALUES (5,'alan',1);
INSERT INTO users (id, name, num) VALUES (6,'maros',14);
INSERT INTO users (id, name, num) VALUES (7,'fero',1);
INSERT INTO users (id, name, num) VALUES (8,'matej',8);
INSERT INTO users (id, name, num) VALUES (9,'maros',55);
我执行以下查询 - 仅使用 LAST_VALUE 分析函数和 ORDER BY 分析子句:
我的假设是这个查询在一个分区上执行——整个表(因为缺少 partition by 子句)。它将在给定分区(整个表)中按名称对行进行排序,并将使用默认窗口子句RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。
select us.*,
last_value(num) over (order by name) as lv
from users us;
但是上面执行的查询将给出与下面的完全相同的结果。我对第二个查询的假设是,该查询首先按名称对表行进行分区,然后按 num 对每个分区中的行进行排序,然后在每个分区上应用窗口子句 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 以获得 LAST_VALUE。
select us.*,
last_value(num) over (partition by name order by num RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lv
from users us;
我的一个假设显然是错误的,因为上述两个查询给出了相同的结果。看起来第一个查询订单记录也是幕后的 num。您能否指出我的假设有什么问题以及为什么这些查询返回相同的结果?
【问题讨论】: