求SQL查询语句:从##RUN_ID临时表中筛选目标结果集
解决方法:筛选每个组合的最大RUN_ID记录
看起来你需要从临时表##RUN_ID中,为每个EMPID+STARTDT+VAL的组合保留RUN_ID最大的那条记录,并且按STARTDT升序排列对吧?我根据你的输入数据和期望输出,整理了两种可行的SQL方案:
方案1:使用窗口函数(推荐,逻辑清晰)
窗口函数ROW_NUMBER()可以很方便地为每个分组内的记录排序,直接筛选出每组的第一条(对应最大RUN_ID的记录):
WITH ranked_records AS ( SELECT RUN_ID, EMPID, STARTDT, VAL, -- 按EMPID、STARTDT、VAL分组,组内按RUN_ID降序排名 ROW_NUMBER() OVER (PARTITION BY EMPID, STARTDT, VAL ORDER BY RUN_ID DESC) AS record_rank FROM ##RUN_ID ) SELECT RUN_ID, EMPID, STARTDT, VAL FROM ranked_records WHERE record_rank = 1 -- 取每组排名第一的记录(即RUN_ID最大的) ORDER BY STARTDT; -- 按日期升序排列,和期望输出顺序一致
方案2:使用GROUP BY子查询关联
如果你更习惯传统的分组查询方式,可以先找出每个组合的最大RUN_ID,再关联原表获取完整记录:
SELECT r.RUN_ID, r.EMPID, r.STARTDT, r.VAL FROM ##RUN_ID r INNER JOIN ( -- 先分组计算每个EMPID+STARTDT+VAL的最大RUN_ID SELECT EMPID, STARTDT, VAL, MAX(RUN_ID) AS max_run_id FROM ##RUN_ID GROUP BY EMPID, STARTDT, VAL ) grouped_data ON r.EMPID = grouped_data.EMPID AND r.STARTDT = grouped_data.STARTDT AND r.VAL = grouped_data.VAL AND r.RUN_ID = grouped_data.max_run_id ORDER BY r.STARTDT;
结果说明
执行任意一种方案后,针对你提供的测试数据,会得到包含所有符合逻辑的记录(你的期望输出展示了其中两行,推测是示例简化):
RUN_ID EMPID STARTDT VAL ------ ----- --------- --- 3 1 12/1/2017 A 1 1 1/1/2018 A 5 1 2/1/2018 A 4 1 3/1/2018 A
内容的提问来源于stack exchange,提问作者VIJAY SHARMA
相关产品推荐
相关产品推荐

