You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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;

代码说明

  1. 定位目标记录:通过employee_name_entries公共表表达式(CTE)筛选出所有A列等于"Employee Name"的记录,同时用LAG函数按B列递增顺序,获取每条记录的上一行(prev_row)和再上一行(prev_prev_row)的A列值。
  2. 筛选正确姓名:在candidate_names中用CASE逻辑判断:如果上一行是null或者纯数字,就取再上一行的值作为员工姓名;否则直接用上一行的值。
  3. 去重与过滤:最后一步去重候选姓名,同时过滤掉null值和纯数字的无效条目,排序后输出结果。

适配不同数据库的小调整

如果你的数据库不是MySQL,正则表达式语法需要对应修改:

  • PostgreSQL:把REGEXP换成~,比如prev_row ~ '^[0-9]+$'
  • SQL Server:用PATINDEX判断纯数字,比如PATINDEX('%[^0-9]%', prev_row) = 0

这个方案只需要扫描一次原表,在600万条数据的场景下性能表现更优。

内容的提问来源于stack exchange,提问作者Stephen - Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:47:27