继续问我的问题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上是不同的,并且它还应该在列中一起映射两行具有相同值的行
这可能吗?
答案 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。