【问题标题】:Tricky Postgresql query棘手的 Postgresql 查询
【发布时间】:2015-03-02 19:07:21
【问题描述】:

给定下表。

CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, b)
);

如何为每个a 获得一行,这样ca 的最大值?

例如给定下表,

a|b|c
-----
1 1 1
1 2 2
2 1 9
3 2 4
3 3 5
3 4 6

我应该回来

a|b|c
-----
1 2 2
2 1 9
3 4 6

【问题讨论】:

标签: sql postgresql greatest-n-per-group


【解决方案1】:

诀窍是在您加入的派生表中为每个a 找到最大c,如下所示:

select a, b, c
from example
join (select a, max(c) max_c from example group by a) max_c
on example.a = max_c.a and example.c = max_c.max_c

【讨论】:

  • 最后一行应该是'example.a = max_c.a'而不是max_c.c
  • 如果有多行具有相同的ac 值,这将返回多行,例如{1, 0, 2}, {1, 1, 0}, {1, 2, 2}, {1, 3, 1},a=1 的内部查询中的 max_c 将为 2,而join 将同时匹配 {1, 0, 2} 和​​ {1, 2, 2}
  • @IMSoP 确实会。但这将是不同的行。我不认为这是一个错误。单看数据是无法判断的。很容易添加max(b)group by a,c 来修复它。
  • @jpw 该问题要求“每个 a 一行”,但此解决方案仅保证您是否可以在 (a, c) 上添加唯一约束。这些行是不同的,但它们在列b 上是不同的,这是我们的“输出”值,所以你必须以某种方式将它们打成平局。此(简化)示例中的一个选项是采用min(b),但如果有更多列,则您将混合来自不同行的值,这在这种情况下通常不需要。
  • @IMSoP 我想您的最后一条评论在我添加带有 max 和 group by 的部分之前可能解决了我之前的评论?
猜你喜欢
  • 2016-01-12
  • 2013-08-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多