【问题标题】:Finding min + 1 in Postgres在 Postgres 中找到 min + 1
【发布时间】:2016-04-05 04:03:18
【问题描述】:

大家好,我有一个 postgres 表,其中有一列用于事件,一列用于序列。每个事件可能有多个序列。例如:

Event  |   Sequence
a      |    1
a      |    4
a      |    5
b      |    1
b      |    2

现在我知道 select min(sequence) group by event 给了我最小的序列。我如何获得最小值之后的下一个值。我希望这是有道理的。提前致谢。 我正在使用 Postgres 9.3。

【问题讨论】:

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


    【解决方案1】:

    您可以使用ROW_NUMBER()Event 进行分区并按Sequence 排序以获得每个事件的第二低序列号;

    SELECT Event, Sequence 
    FROM (
      SELECT Event, Sequence, 
             ROW_NUMBER() OVER (PARTITION BY Event ORDER BY Sequence) rn
      FROM Table1
    ) z
    WHERE rn = 2;
    

    An SQLfiddle to test with.

    【讨论】:

      【解决方案2】:

      编辑有点复杂,但如果您需要不依赖于ROW_NUMBER() 的查询,请使用带有自连接的子查询来排除每个事件的最小序列的行:

      SELECT outer_query.Event, MIN(outer_query.Sequence) AS SecondMinSeq
      FROM Table1 as outer_query
      INNER JOIN (
          SELECT Table1.Event, MIN(Sequence) AS MinSeq
          FROM Table1
          GROUP BY Table1.Event
      ) AS min_sequences
      ON outer_query.Event = min_sequences.Event AND outer_query.Sequence <> min_sequences.MinSeq
      GROUP BY outer_query.Event
      

      SQL 小提琴:http://sqlfiddle.com/#!15/4438b/7

      【讨论】:

      • 如果序列不按顺序怎么办..例如,如果 a 有序列 1、3、7、11 等,那么我如何选择第二最小的序列..希望这更有意义..
      猜你喜欢
      • 2021-09-21
      • 2013-12-31
      • 2012-11-12
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      相关资源
      最近更新 更多