选择第二个最低值的集合

时间:2017-06-24 19:44:56

标签: sql select subset rpostgresql

我有两列兴趣ID和截止日期:

ID    Deadline (DD/MM/YYYY)
1        01/01/2017
1        05/01/2017
1        04/01/2017
2        02/01/2017
2        03/01/2017  
2        06/02/2017
2        08/03/2017

每个ID可以有多个(n)截止日期。我需要选择截止日期为每个个人ID的第二低的所有行。

期望的输出:

ID    Deadline (DD/MM/YYYY)
1        04/01/2017
2        03/01/2017  

选择最小值可以通过以下方式完成:

select min(deadline) from XXX group by ID

但我迷失了#34;中间"值。我正在使用Rpostgresql,但任何想法都有帮助。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

一种方法是使用ROW_NUMBER()窗口函数

SELECT id, deadline
  FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY deadline) rn
      FROM xxx 
  ) q
 WHERE rn = 2 -- get only second lowest ones

LATERAL

SELECT t.*
  FROM (
    SELECT DISTINCT id FROM xxx
  ) i JOIN LATERAL (
    SELECT *
      FROM xxx
     WHERE id = i.id
     ORDER BY deadline 
     OFFSET 1 LIMIT 1
  ) t ON (TRUE)

输出:

 id |  deadline
----+------------
  1 | 2017-04-01
  2 | 2017-03-01

这是dbfiddle演示

答案 1 :(得分:0)

在获取不同记录后使用 ROW_NUMBER()将消除在有重复记录时获得最低日期而非第二低日期的机会。

pub use option::Option::{self, Some, None};
pub use result::Result::{self, Ok, Err};