Oracle SQL如何查询CAR值A1、A10对应的前3行与后4行数据
Oracle SQL实现取指定行前后N行数据方案
实现逻辑
先对全表按时间字段升序排序生成唯一行号,再定位目标CAR(A1、A10)对应的行号,最后筛选行号落在「目标行号-3 至 目标行号+4」区间的所有记录即可,该方案和Spotfire的窗口函数逻辑同源,支持大数据量场景。
完整SQL代码
WITH -- 第一步:对全表按时间排序生成唯一行号,注意要将字符串格式的时间转成时间类型排序,避免字符串排序错乱 ranked_data AS ( SELECT CAR, TIME, ROW_NUMBER() OVER ( ORDER BY TO_TIMESTAMP(TIME, 'MM/DD/YYYY HH:MI:SS AM'), CAR ) AS row_num FROM 你的表名 -- 替换为实际表名 ), -- 第二步:定位目标CAR对应的行号 target_pos AS ( SELECT row_num AS target_row, CAR AS target_car FROM ranked_data WHERE CAR IN ('A1', 'A10') ) -- 第三步:关联筛选符合区间的记录 SELECT DISTINCT -- 若两个目标的区间重叠,加DISTINCT可去重,不需要可去掉 r.CAR, r.TIME -- 可选:加上t.target_car标记当前行属于哪个目标的关联结果 -- , t.target_car FROM ranked_data r INNER JOIN target_pos t ON r.row_num BETWEEN t.target_row - 3 AND t.target_row + 4 ORDER BY r.row_num;
说明
- 排序规则可按需调整:如果时间相同时需要自定义排序优先级,可修改
ROW_NUMBER()的ORDER BY子句新增排序字段 - 边界自动适配:如果目标行号小于3,
target_row -3会小于1,Oracle的BETWEEN会自动从第一行开始取,不会报错 - 性能:窗口函数是Oracle原生优化的算子,千万级数据量下也能高效运行,不需要额外的全表多次扫描
内容的提问来源于stack exchange,提问作者levi_ackerman
相关产品推荐
相关产品推荐

