如何用EXISTS运算符按组筛选最新记录(含File Geodatabase限制)
实现方案
针对你的需求,结合File Geodatabase支持的SQL-92子集(仅支持EXISTS和标量子查询,不支持关联子查询),可以通过以下WHERE子句表达式实现筛选:
WHERE EXISTS ( SELECT 1 FROM ( -- 标量子查询获取当前ASSET_ID对应的最新检查日期 SELECT MAX(date_) AS max_date FROM RoadInsp WHERE ASSET_ID = RoadInsp.ASSET_ID ) AS max_dates -- 匹配当前行的日期为最新日期 WHERE RoadInsp.date_ = max_dates.max_date -- 若同一资产有多条最新日期记录,任选其一(这里用INSP_ID取最小的示例,可替换为你的唯一标识列) AND RoadInsp.INSP_ID = ( SELECT MIN(INSP_ID) FROM RoadInsp WHERE ASSET_ID = RoadInsp.ASSET_ID AND date_ = max_dates.max_date ) )
关键说明
- 内层标量子查询
SELECT MAX(date_) ...用于获取当前ASSET_ID对应的最新检查日期,适配File Geodatabase的语法支持要求。 - EXISTS子句用于判断当前行是否属于该资产的最新日期组;若无需处理同日期重复行,可直接去掉最后那个标量子查询部分,仅保留
RoadInsp.date_ = max_dates.max_date。 - 当同一资产存在多条最新日期的记录时,通过取唯一标识列(示例中为
INSP_ID)的最小/最大值,实现“任选其一”的效果,确保返回结果唯一。
模拟数据验证(Oracle 18c环境)
如果用CTE模拟RoadInsp表数据,完整查询示例如下(仅用于验证,实际只需使用上述WHERE子句部分):
WITH RoadInsp AS ( SELECT 'RD001' AS ASSET_ID, DATE '2024-01-01' AS date_, 'INSP001' AS INSP_ID FROM DUAL UNION ALL SELECT 'RD001' AS ASSET_ID, DATE '2024-03-15' AS date_, 'INSP002' AS INSP_ID FROM DUAL UNION ALL SELECT 'RD001' AS ASSET_ID, DATE '2024-03-15' AS date_, 'INSP003' AS INSP_ID FROM DUAL UNION ALL SELECT 'RD002' AS ASSET_ID, DATE '2023-12-20' AS date_, 'INSP004' AS INSP_ID FROM DUAL ) SELECT * FROM RoadInsp WHERE EXISTS ( SELECT 1 FROM ( SELECT MAX(date_) AS max_date FROM RoadInsp WHERE ASSET_ID = RoadInsp.ASSET_ID ) AS max_dates WHERE RoadInsp.date_ = max_dates.max_date AND RoadInsp.INSP_ID = ( SELECT MIN(INSP_ID) FROM RoadInsp WHERE ASSET_ID = RoadInsp.ASSET_ID AND date_ = max_dates.max_date ) );
该查询会返回每个ASSET_ID的最新日期记录,若有重复则返回INSP_ID最小的那条。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

