代码之家  ›  专栏  ›  技术社区  ›  sudoExclamationExclamation

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

  •  1
  • sudoExclamationExclamation  · 技术社区  · 1 月前

    我现在有这个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 但这似乎没有得到支持。

    3 回复  |  直到 1 月前
        1
  •  3
  •   Frank Heikens    1 月前

    只需按第一列排序:

    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
    

    另请参见 manual

        2
  •  3
  •   Zegarek    1 月前

    如果您希望重用窗口定义,可以使用以下命令单独定义它 window w1 as (order by..) 那么 row_number() over (..) 成为 row_number()over w1 您可以从任何其他窗口函数引用相同的窗口定义。您还可以基于已有的窗口定义创建新的窗口定义。

    demo at 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
    --order by 1
    order by row_number()over w1
    
    指数 sum1 sum2 身份证件 标题 年龄 优先 user_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.

    至于 order by ,在您的示例中,按您使用它生成的行号排序就足够了 订购方式 您可以通过别名或序号位置引用它。 Quoting the doc :

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

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

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

        3
  •  1
  •   Ahmed Amin Shahin    1 月前
    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;