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 名称的捷径。您将不得不在那里重复这些表达式。
我正在尝试按照
的方式做一些事情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 名称的捷径。您将不得不在那里重复这些表达式。