PostgreSQL查询:按队列忽略每日(18:00起)前2条数据
解决方案
核心思路是按队列+自定义周期(18:00起始的日)分组,在每个分组内忽略前2条数据。具体步骤如下:
- 转换纳秒级时间戳为PostgreSQL可识别的
timestamp类型; - 计算自定义周期的日期:将时间戳减去18小时后取日期,这样当天18:00到次日18:00的所有记录会被归为同一个周期;
- 用
row_number()按队列和周期日期分区排序,过滤掉每个分区内的前2条。
完整查询代码:
SELECT id, queue, "timestamp" FROM ( SELECT id, queue, "timestamp", row_number() OVER ( PARTITION BY queue, DATE(to_timestamp("timestamp"/1000000000) - INTERVAL '18 hours') ORDER BY "timestamp" ) AS row_n FROM mytable ) results WHERE row_n > 2;
逻辑验证(对应示例数据)
以q2为例:
- 周期
2023-01-14包含id5(18:30)、id6(20:30)、id7(次日05:30)、id8(次日17:10),前2条被过滤,保留id7、id8; - 周期
2023-01-18包含id9(18:50)、id10(20:50)、id11(次日02:50)、id12(次日12:50),前2条被过滤,保留id11、id12;
q1的周期2023-01-14包含id1、id2、id3,前2条被过滤,保留id3;
q3的周期2023-01-14只有2条记录,全部被过滤,无结果。
最终结果与预期一致:id3、7、8、11、12。
内容的提问来源于stack exchange,提问作者Yang
相关产品推荐
相关产品推荐

