从表中获取第二高的值已经解决了很多次,但我正在寻找每个组中的第二高值。
鉴于此表:
+----+-----+
| A | 10 |
| A | 20 |
| A | 35 | <-- This record
| A | 42 |
| B | 12 |
| B | 21 | <-- This record
| B | 33 |
| C | 14 |
| C | 23 |
| C | 38 |
| C | 41 | <-- This record
| C | 55 |
+----+-----+
我想得到标记的行。
伪代码:
select col_a, penultimate(col_b)
from foo
group by col_a;
您可以为此使用窗口函数。
假设每组不同的值。所以我们不需要断绝关系。
假设每组至少有 2 行 - 或以下查询中断。(您需要做更多工作,首先为这些情况定义“第二高值”。)
每组多于几行,(虽然该功能尚未直接实现,但从第 14 页开始)模拟索引跳过扫描将(快得多)。取第二高值有点棘手:
db<>在这里摆弄
看:
需要一个适用的索引才能快速。喜欢:
Postgres 几乎可以全速向后扫描索引。但是列的组合排序顺序不能与查询不一致。看: