从600万条PDF提取数据中查询员工姓名的SQL需求
解决方案:提取PDF会计文档中的员工姓名
针对你600万条记录的数据库场景,我们可以利用窗口函数高效定位每个"Employee Name"对应的员工姓名,同时处理上一行是null或纯数字的情况,最终输出去重且过滤纯数字的姓名列表。
完整SQL代码
WITH employee_name_entries AS ( SELECT B, LAG(A, 1) OVER (ORDER BY B) AS prev_row, LAG(A, 2) OVER (ORDER BY B) AS prev_prev_row FROM PAYROLL_RECORDS WHERE A = 'Employee Name' ), candidate_names AS ( SELECT CASE WHEN prev_row IS NULL OR prev_row REGEXP '^[0-9]+$' THEN prev_prev_row ELSE prev_row END AS employee_name FROM employee_name_entries ) SELECT DISTINCT employee_name FROM candidate_names WHERE employee_name IS NOT NULL AND employee_name NOT REGEXP '^[0-9]+$' ORDER BY employee_name;
代码说明
- 定位目标记录:通过
employee_name_entries公共表表达式(CTE)筛选出所有A列等于"Employee Name"的记录,同时用LAG函数按B列递增顺序,获取每条记录的上一行(prev_row)和再上一行(prev_prev_row)的A列值。 - 筛选正确姓名:在
candidate_names中用CASE逻辑判断:如果上一行是null或者纯数字,就取再上一行的值作为员工姓名;否则直接用上一行的值。 - 去重与过滤:最后一步去重候选姓名,同时过滤掉null值和纯数字的无效条目,排序后输出结果。
适配不同数据库的小调整
如果你的数据库不是MySQL,正则表达式语法需要对应修改:
- PostgreSQL:把
REGEXP换成~,比如prev_row ~ '^[0-9]+$' - SQL Server:用
PATINDEX判断纯数字,比如PATINDEX('%[^0-9]%', prev_row) = 0
这个方案只需要扫描一次原表,在600万条数据的场景下性能表现更优。
内容的提问来源于stack exchange,提问作者Stephen - Developer
相关产品推荐
相关产品推荐

