PostgreSQL——是否可以在查询的 ORDER BY 子句中使用命名 window?

PostgreSQL -- is it possible to use named window in query's ORDER BY clause?

我正在尝试按照

的方式做一些事情
SELECT id, sum(weight) OVER w
FROM foo
-- Use random() to break ties
WINDOW w AS (ORDER BY weight DESC, random())
ORDER BY w
LIMIT 1;

但它出错了

ERROR:  column "w" does not exist
LINE 5: ORDER BY w 

我当然可以重写为

SELECT id, sum(weight) OVER w
FROM foo
-- Use random() to break ties
WINDOW w AS (ORDER BY weight DESC, random())
ORDER BY weight DESC, random()
LIMIT 1;

但是除了缩短查询(我正在处理的完整查询要复杂得多并且在 w 上有几个 window 函数),我想捕获相同的 random() 用于计算 sum(weight) 的排序,而不是让 PostgreSQL 生成不同的随机决胜局。

这里 a DB fiddle 展示了我正在处理的数据集类型。我想确保查询输出中的第二列始终单调递增。在这个简单的合成示例中,它是否保证会这样做,还是恰好会这样做?我的真实查询有很多横向连接,实际上是为了阻止优化器从中提取常量,所以我不确定它是否会一直有效。

编辑:正如@laurenz-albe 指出的那样,这不可能直接实现。但是,在我的具体情况下,我意识到我已经有一个可以直接排序的值,在 sum(weight)like in this fiddle.

问题是 order by -- w 是 window 框架而不是列。据推测,你想要这样的东西:

SELECT id, sum(weight) OVER w
FROM foo
-- Use random() to break ties
WINDOW w AS (ORDER BY weight DESC, random())
ORDER BY 2
LIMIT 1;

Here 是一个 db<>fiddle.

您不能采取在 ORDER BY 子句中使用 window 名称的捷径。您将不得不在那里重复这些表达式。