微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。