如何调整SQL实现同一person_number下重复elements仅首行显示
解决方案
你可以通过窗口函数LAG()比对同分组内上一行的elements值,实现仅首行展示重复值的需求,修改后的查询语句如下:
WITH original_result AS ( -- 你原来的UNION ALL查询整体放在这里作为基础结果集 select person_number , elements, batchid, co_code from per_all_people_f papf, elements_tab elements, batch_tab batch, company_det co where papf.person_id = company_det.person_id and elements.element_id = company_det.element_id and batch.batchid = co.batchid union all select person_number , elements.absence_name elements, batchid, co_code from per_all_people_f papf, absence_tab elements, batch_tab batch, company_det co where papf.person_id = company_det.person_id and elements.absence_id =company_det.absence_id and batch.batchid = co.batchid ) SELECT person_number, -- 同person_number下,当前行和上一行elements值一致时返回空,否则返回当前值 CASE WHEN LAG(elements, 1) OVER (PARTITION BY person_number ORDER BY batchid) = elements THEN NULL ELSE elements END AS elements, batchid, co_code FROM original_result ORDER BY person_number, batchid
逻辑说明
- 先通过CTE封装你原有查询的结果,不需要改动原有业务逻辑
LAG(elements,1) OVER (PARTITION BY person_number ORDER BY batchid)作用是取同一个person_number分组内,上一行的elements值- 用CASE做判断:当前行和上一行的
elements值相同时返回空,否则返回原值,即可实现你要的展示效果 - 排序规则可根据你的实际需求调整,只要保证同一个
person_number的行连续即可。
额外提示:你原有SQL中FROM子句的表列表末尾多了多余的逗号,我在上述示例中已经直接修正,执行时不会报错。如果你的数据库不支持CTE语法,直接把原有查询放在FROM子句中作为子查询使用,效果完全一致。
内容的提问来源于stack exchange,提问作者SSA_Tech124
相关产品推荐
相关产品推荐

