gpt4 book ai didi

sql - Postgres GROUP BY,然后排序

转载 作者:行者123 更新时间:2023-11-29 11:53:36 26 4
gpt4 key购买 nike

我有一个数据库查询:

SELECT 
Foo,
Foo2,
some_calc as Bar,
some_other_calc as Bar2,
From
FooBar
-- some inner joins for the calcs
GROUP BY FOO
ORDER BY Bar DESC, Bar2 DESC;

我想通过订单查询按数据库排序,然后将 FOO 组合在一起,以便第一个分组的 block 包含具有最大 Bar 的 FOOFOO 的第二个分组 block 包含第二高的 Bar,等等。

但这行不通,因为 Postgres 不允许随机分组:

列“Bar”必须出现在 GROUP BY 子句中或用于聚合函数

我该如何解决这个问题?

示例数据和输出:

╔═════╦══════════╦════╦════╦
║ FO ║ Bar ║ Bar 2 ║
╠═════╬══════════╬═════════╬
║ 6 ║ 10 ║ ║
║ 4 ║ 110 ║ ║
║ 3 ║ 120 ║ ║
║ 8 ║ 140 ║ ║
║ 3 ║ 180 ║ ║
║ 3 ║ 190 ║ ║
╚═════╩══════════╩════╩════╩

输出:

╔═════╦══════════╦════╦════╦
║ FO ║ Bar ║ Bar 2 ║
╠═════╬══════════╬═════════╬
║ 3 ║ 190 ║ ║
║ 3 ║ 180 ║ ║
║ 3 ║ 120 ║ ║
║ 8 ║ 140 ║ ║
║ 4 ║ 110 ║ ║
║ 6 ║ 10 ║ ║
╚═════╩══════════╩════╩════╩

最佳答案

SELECT foo, <some calc> AS bar, bar2
FROM foobar
ORDER BY max(<some calc>) OVER (PARTITION BY foo) DESC NULLS LAST -- can't refer to bar
, bar DESC NULLS LAST -- but you can here
, foo DESC NULLS LAST;

bar 不必是列,可以是任何有效的表达式,甚至是聚合函数(与 GROUP BY 组合)——只是不是另一个窗口函数,不能嵌套。示例:

但是,您不能在窗口函数内的同一查询级别上引用列别名(输出列名称)。您必须重新拼写表达式,或将计算移至子查询或 CTE。
可以ORDER BYGROUP BY 中引用输出列名称,否则(但不能在 WHEREHAVING 子句)。说明:

由于尚未定义,我们必须期待 NULL 值。通常您希望 NULL 值放在最后,因此按降序添加 NULLS LAST。见:

假设您首先想要更大的 foo 以防与 bar 相关。

关于sql - Postgres GROUP BY,然后排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com