在PostgreSQL中为每个客户选择最后两条记录

Pav*_*mar 2 sql postgresql

你能否向我展示以下场景的查询?我在表格中有这些列access_log:

customer_id |  service_name | accessed_time
Run Code Online (Sandbox Code Playgroud)

客户可能已经在任何时间访问了该服务.但我只需列出每个记录的最后两个记录customer_id.

mu *_*ort 11

窗口功能拯救(再次):

select customer_id, service_name, accessed_time
from (
    select customer_id, service_name, accessed_time,
           rank() over (partition by customer_id order by accessed_time desc) as rank
    from access_log
) dt
where dt.rank <= 2
Run Code Online (Sandbox Code Playgroud)

这假定"最后两个"意味着"最近的两个".该row_number窗口的功能取决于您希望如何处理重复的可能更合适.

鉴于这样的数据(对不起,我今晚感觉不到那么富有想象力):

=> select * from access_log order by customer_id, accessed_time;
 customer_id | service_name |    accessed_time    
-------------+--------------+---------------------
           1 | one          | 2011-01-01 00:00:00
           1 | two          | 2011-01-02 00:00:00
           1 | three        | 2011-01-03 00:00:00
           2 | two          | 2011-01-02 00:00:00
           2 | one          | 2011-04-01 00:00:00
           2 | three        | 2011-05-03 00:00:00
Run Code Online (Sandbox Code Playgroud)

以上查询得出:

 customer_id | service_name |    accessed_time    
-------------+--------------+---------------------
           1 | three        | 2011-01-03 00:00:00
           1 | two          | 2011-01-02 00:00:00
           2 | three        | 2011-05-03 00:00:00
           2 | one          | 2011-04-01 00:00:00
Run Code Online (Sandbox Code Playgroud)


Luk*_*der 5

这些方面的东西应该有效:

select * from access_log a1
where 2 > (select count(*) from access_log a2
           where a1.customer_id = a2.customer_id
           and a1.accessed_time < a2.accessed_time)
Run Code Online (Sandbox Code Playgroud)

其内容如下:获取同一客户存在0或1个其他访问日志的所有日志,以及稍后的"accessible_time".确保在相关列上有适当的索引.