AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79320823
Accepted
sudoExclamationExclamation
sudoExclamationExclamation
Asked: 2025-01-01 05:16:12 +0800 CST2025-01-01 05:16:12 +0800 CST 2025-01-01 05:16:12 +0800 CST

有没有办法可以防止 ROW_NUMBER 的 ORDER BY 重复同样的事情?

  • 772

我目前有这个 SQL:

select ROW_NUMBER() OVER (order by priority DESC NULLS LAST,
                                   created_at DESC) as index
     , id
     , title
     , ago(created_at)
     , priority
     , user_id 
from post 
order by priority DESC NULLS LAST
       , created_at DESC;

正如你所看到的,我需要ROW_NUMBER()有

(order by priority desc nulls last, created_at desc) as index, 
id, title, ago(created_at)

这让我重复同样长

order by priority desc nulls last, created_at desc

两次。

如果我需要在排序时包含更多列,那么它将变得更长。

有没有办法防止这种重复?我尝试在后面使用别名,ORDER BY但似乎不受支持。

sql
  • 4 4 个回答
  • 97 Views

4 个回答

  • Voted
  1. Zegarek
    2025-01-01T08:14:52+08:002025-01-01T08:14:52+08:00

    如果您希望重新使用窗口定义,可以使用 单独定义它window w1 as(order by..),然后row_number()over(..)变成row_number()over w1,您可以从任何其他窗口函数引用相同的窗口定义。您还可以基于已有的窗口定义创建新的窗口定义。
    演示位于 db<>fiddle

    select row_number()over w1 as index
         , sum(id)over w1 as sum1
         , sum(id)over(w1 rows between 1 preceding
                                   and 0 following)as sum2
         , id
         , title
         , age(created_at)
         , priority
         , user_id 
    from post 
    window w1 as (order by priority DESC NULLS LAST
                         , created_at DESC)
    --order by index             --referencing the first column by alias
    --order by 1                 --referecing the first column by ordinal position
    order by row_number()over w1 --repeating the first column expression
    
    指数 总和1 总和2 ID 标题 年龄 优先事项 用户身份
    1 1 1 1 标题1 23:54:27.360735 4 2
    2 3 3 2 标题2 -00:05:32.639265 3 3
    3 6 5 3 标题3 -1 天 -00:05:32.639265 2 4
    4 10 7 4 标题4 -2 天 -00:05:32.639265 1 1

    引用条款SELECT..WINDOW文档:

    可选WINDOW子句的一般形式为

    WINDOW window_name AS ( window_definition ) [, ...]
    

    其中window_name是可以从子句或后续窗口定义中引用的名称OVER,window_definition并且

    [ existing_window_name ]
    [ PARTITION BY expression [, ...] ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ frame_clause ]
    

    如果existing_window_name指定了,则必须引用WINDOW列表中较早的条目;新窗口将从该条目复制其分区子句,以及其排序子句(如果有)。在这种情况下,新窗口不能指定自己的PARTITION BY子句,并且只有在复制的窗口没有子句时才可以指定ORDER BY。新窗口始终使用自己的框架子句;复制的窗口不得指定框架子句。

    至于order by,在您的示例中,使用您已有的行号按您生成的行号排序就足够了,从而达到相同的有效顺序。您可以重复表达式(使用窗口名称可以节省重复它的order by),通过别名或序数位置引用它。引用文档中的SELECT..ORDER BY子句:

    每个表达式可以是输出列(列表项)的名称或序数SELECT,也可以是由输入列值形成的任意表达式。

    序数是指输出列的序数(从左到右)位置。此功能使得可以根据没有唯一名称的列定义排序。这从来都不是绝对必要的,因为始终可以使用子句为输出列分配名称AS。

    也可以在ORDER BY子句中使用任意表达式,包括未出现在SELECT输出列表中的列。


    正常的外部和窗口定义内部的行为存在重要差异order by。前者可以使用别名和序数位置,而后者根本不接受列别名,但更重要的是,其中的数字被接受但解释不同:窗口定义将中的数字理解order by为整数文字,而不是列序数位置。
    这意味着over(order by 1)与over(order by true)、 over(order by 'constant')或一样有用over()。

    • 5
  2. Best Answer
    Frank Heikens
    2025-01-01T05:37:24+08:002025-01-01T05:37:24+08:00

    只需按第一列排序:

    SELECT ROW_NUMBER() OVER (ORDER BY priority DESC NULLS LAST, created_at DESC) AS index
         , id
         , title
         , ago(created_at)
         , priority
         , user_id
    FROM post
    ORDER BY 1 ASC; -- 1 = first column
    

    另请参阅手册

    • 4
  3. Ahmed Amin Shahin
    2025-01-01T05:23:39+08:002025-01-01T05:23:39+08:00
    SELECT 
      ROW_NUMBER() OVER (ORDER BY priority DESC NULLS LAST, created_at DESC) as index,
      id,
      title,
      ago(created_at),
      priority,
      user_id
    FROM post
    ORDER BY index;
    
    • 1
  4. Waqas Nawaz Warraich
    2025-01-02T17:40:36+08:002025-01-02T17:40:36+08:00
    WITH OrderedPosts AS (
        SELECT ROW_NUMBER() OVER (ORDER BY priority DESC NULLS LAST, created_at DESC) AS index,
               id, title, ago(created_at), priority, user_id
        FROM post
    )
    SELECT * FROM OrderedPosts
    ORDER BY priority DESC NULLS LAST, created_at DESC;
    
    • 0

相关问题

  • 更新除某些列上具有相同值的行之外的所有行

  • 当我返回 sql 列时,有没有办法只反转数字?(希伯来语)

  • 布尔值之间的 SQL less/greater 比较会产生意外结果

  • 如何根据数组中的匹配更新 Postgres 表中的值

  • 如何在sql server中对列求和

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve