PostgreSQL技术问询:按client_name获取每个客户的最后2条记录
解决方案
没问题,咱们可以借助PostgreSQL的窗口函数ROW_NUMBER()来实现每个client_name仅保留最后2条记录的需求,以下是调整后的查询语句:
SELECT timestamp, internal, external, client_name FROM ( SELECT timestamp, internal, external, client_name, -- 按client_name分组,每组内按时间倒序编号,最新的记录排第1位 ROW_NUMBER() OVER (PARTITION BY client_name ORDER BY timestamp DESC) AS row_num FROM ( SELECT *, (refno_id || ' - ' || client_name) ref_cl FROM ( SELECT distinct timestamp::text, internal::int, external::int, refnum FROM reports_jobpull_active_jobss ) AS jp_active LEFT JOIN ( SELECT client_name, refno_id FROM accessibility_ph_refno ) AS ph_refno ON jp_active.refnum = ph_refno.refno_id ) jp_data WHERE split_part(timestamp::text,' ',1) IN ( SELECT distinct split_part(timestamp::text,' ',1) date FROM reports_jobpull_active_jobss ORDER BY date DESC LIMIT 10 ) ) ranked_data -- 只保留每个client_name下最新的2条记录 WHERE row_num <= 2 -- 可选:按客户名+时间正序排列,方便分组查看 ORDER BY client_name, timestamp ASC;
关键逻辑说明:
- 窗口函数分组排序:
ROW_NUMBER() OVER (PARTITION BY client_name ORDER BY timestamp DESC)会把数据按client_name拆分成分组,每组内按照时间戳倒序给记录编号,最新的记录编号为1,次新为2。 - 筛选Top2记录:外层通过
WHERE row_num <= 2,直接过滤掉每个分组内编号大于2的旧记录,只保留最新的2条。 - 排序优化:最后用
ORDER BY client_name, timestamp ASC让结果按客户名分组,每组内的记录从旧到新排列,你也可以根据需求修改排序规则。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

