问题描述
CREATE TABLE tablename (
`SchoolName` VARCHAR(10),`Marks` INTEGER
);
INSERT INTO tablename
(`SchoolName`,`Marks`)
VALUES
('A',71),('A',('B',254),135),453),153);
SELECT
*
FROM
(
SELECT
SchoolName,Marks,row_number() OVER (PARTITION BY SchoolName ORDER BY Marks) rn
FROM tablename
WINDOW w AS (PARTITION BY SchoolName ORDER BY Marks)
) t
如果查询中有带有order by子句的未使用的命名窗口,rn
是否可以不排序?
SchoolName Marks rn
A 71 1
A 71 2
A 71 3
B 254 1
B 135 2
B 453 3
B 153 4
https://www.db-fiddle.com/f/pWH7ar9V8JLQ6FzM9Qd9K6/1
编辑
我想是这样的
SchoolName Marks rn
A 71 1
A 71 2
A 71 3
B 135 1
B 153 2
B 254 3
B 453 4
编辑2
好的,我有些困惑,问题不在于行的顺序,而是如果我为row_number()
指定了顺序,为什么rn在254旁有值1。
P.s。我知道如果删除window w
会很好,但是为什么未使用的命名窗口会影响其他窗口功能?
解决方法
您的查询定义了一个未使用的window
框架-该部分只是一个无操作。
这些是等效的:
SELECT
SchoolName,Marks,row_number() OVER (PARTITION BY SchoolName ORDER BY Marks) rn
FROM tablename
并且:
SELECT
SchoolName,row_number() OVER w rn
FROM tablename
WINDOW w AS (PARTITION BY SchoolName ORDER BY Marks)
我也看不到使用子查询的意义-因此我删除了该部分。
请注意,ORDER BY
子句仅适用于窗口函数。您的查询和上面的两个查询都不能保证结果集中的行顺序。如果要在结果集中进行一致的排序,请使用order by
子句,如:
SELECT
SchoolName,row_number() OVER (PARTITION BY SchoolName ORDER BY Marks) rn
FROM tablename
ORDER BY SchoolName,Marks