我目前有这个 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
但似乎不受支持。
如果您希望重新使用窗口定义,可以使用 单独定义它
window w1 as(order by..)
,然后row_number()over(..)
变成row_number()over w1
,您可以从任何其他窗口函数引用相同的窗口定义。您还可以基于已有的窗口定义创建新的窗口定义。演示位于 db<>fiddle
引用条款
SELECT..WINDOW
文档:至于
order by
,在您的示例中,使用您已有的行号按您生成的行号排序就足够了,从而达到相同的有效顺序。您可以重复表达式(使用窗口名称可以节省重复它的order by
),通过别名或序数位置引用它。引用文档中的SELECT..ORDER BY
子句:正常的外部和窗口定义内部的行为存在重要差异
order by
。前者可以使用别名和序数位置,而后者根本不接受列别名,但更重要的是,其中的数字被接受但解释不同:窗口定义将中的数字理解order by
为整数文字,而不是列序数位置。这意味着
over(order by 1)
与over(order by true)
、over(order by 'constant')
或一样有用over()
。只需按第一列排序:
另请参阅手册