我有两列兴趣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,但任何想法都有帮助。
感谢您的帮助
答案 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};