如果查询中有未使用的命名窗口,则窗口函数将忽略顺序

问题描述

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