如何在postgresql中针对一个Distinct值获取两行?

时间:2016-09-29 19:08:58

标签: sql postgresql distinct greatest-n-per-group window-functions

继续问我的问题How can I take two rows for one Distinct value in postgresql?

在上面的问题中,我得到了从不同列中获取2个值的基本问题的解决方案。

但在开展工作时,我发现了一个新问题

当我向我的表中引入时间戳

SELECT idnumber
FROM namestable 
GROUP BY idnumber, sectiongroup
HAVING(COUNT(idnumber) = 1)

查询

demo_table 
id  | column1 | column2 |      timestamp
 1  |    1    |    3    | 2016-09-23 00:20:20
 2  |    2    |    3    | 2016-09-24 00:20:20
 3  |    3    |    4    | 2016-09-24 00:20:20
 4  |    4    |    3    | 2016-09-25 00:20:20
 5  |    5    |    4    | 2016-09-25 00:20:20
 6  |    6    |    3    | 2016-09-27 00:20:20
 7  |    7    |    5    | 2016-09-28 00:20:20
 8  |    8    |    5    | 2016-09-28 00:20:20
 9  |    9    |    3    | 2016-09-30 00:20:20

没有回复我的预期:

select id, column1, column2
from (
  select id, column1, column2, 
         row_number() over (partition by column2 order by id) as rn
  from demo_table
) t 
where rn <= 2;

我需要一个可以得到这个结果的查询:

id  | column1 | column2 |      timestamp
 3  |    3    |    4    | 2016-09-24 00:20:20
 5  |    5    |    4    | 2016-09-25 00:20:20
 6  |    6    |    3    | 2016-09-27 00:20:20
 7  |    7    |    5    | 2016-09-28 00:20:20
 8  |    8    |    5    | 2016-09-28 00:20:20
 9  |    9    |    3    | 2016-09-30 00:20:20

该表应该在column2上是不同的,并且它还应该在列中一起映射两行具有相同值的行

这可能吗?

1 个答案:

答案 0 :(得分:0)

您似乎想要第2列中每个值的“2个最新”行。为此,您需要调整order by的{​​{1}}元素。

这里,要获得“最近的”行;按降序排列时间戳。如果您需要为订单打破平局,则会保留over clause列。

id

(时间戳的最后一个顺序然后改变为升序)

注意:在select id, column1, column2, timestamp from ( select id, column1, column2, timestamp, row_number() over (partition by column2 order by timestamp DESC, id) as rn from demo_table ) t where rn <= 2 order by column2, timestamp ; 中,over clause参数控制何时重新排序(当遇到新的“分区”时),然后partition by控制“{1}}中的哪一行分区“变为1。