你能否向我展示以下场景的查询?我在表格中有这些列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)
这些方面的东西应该有效:
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".确保在相关列上有适当的索引.
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |