SQL查询如何移除LEAD函数生成的列且保留其余所有字段
SQL查询去除多余窗口函数字段的调整方法
原查询外层使用了SELECT *,会将子查询中生成的recent_joinee窗口函数字段一并返回,调整时只需修改外层查询的字段选择规则即可,可选方案如下:
方案1:全数据库兼容的通用写法
适用于所有SQL支持的数据库,无需依赖方言特性,将外层的SELECT *替换为employees表的全量原有字段即可,示例如下:
SELECT -- 此处替换为employees表的所有原有字段,不要包含recent_joinee employee_id, name, department_id, hire_date, ... FROM ( SELECT LEAD(hire_date) OVER(PARTITION BY department_id ORDER BY hire_date ) AS recent_joinee, a.* FROM employees a ) t WHERE t.recent_joinee IS NULL;
方案2:支持列排除语法的数据库简化写法
如果使用的是BigQuery、Snowflake、Spark SQL等支持列排除语法的数据库,可以直接指定排除多余字段,无需手动罗列全量字段:
SELECT * EXCEPT (recent_joinee) FROM ( SELECT LEAD(hire_date) OVER(PARTITION BY department_id ORDER BY hire_date ) AS recent_joinee, a.* FROM employees a ) t WHERE t.recent_joinee IS NULL;
方案3:支持QUALIFY语法的数据库最优写法
如果使用的是BigQuery、Snowflake、PostgreSQL 13+等支持QUALIFY窗口函数专用过滤子句的数据库,可以省略子查询,直接返回原表所有字段,写法最简洁:
SELECT a.* FROM employees a QUALIFY LEAD(hire_date) OVER(PARTITION BY department_id ORDER BY hire_date) IS NULL;
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

