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

多表关联时如何获取同eight_id的最新tblSign记录?

问题描述

现有SQL查询语句如下:

SELECT tblSign.sigdate,tblSign.sigtime,tblSign.sigact,tblSign.esignature,tblEmpl.fname,tblEmpl.lname,tblEmpl.location, tblEmpl.estatus,tblLocs.unit,tblLocs.descript,TblLocs.addr1,tblLocs.city,tblLocs.state, tblLocs.zip
FROM tblEmpl
LEFT JOIN tblSign
   ON tblSign.eight_id = tblEmpl.eight_id
      AND tblSign.formid = '9648'
      AND tblSign.sigact <> 'O'
      AND tblSign.sigdate >= '2022-11-01'
LEFT JOIN tblLocs
    ON tblEmpl.location = tblLocs.location
WHERE tblEmpl.estatus = 'A'
    AND tblEmpl.location = '013'
ORDER BY
     tblSign.sigdate ASC;

tblSign表中存在多条相同eight_id的记录,希望关联多表时,仅获取tblSign中每个eight_id对应的最新记录。

当前查询返回的数据:

Sigdatefnamelnamelocationsigact
2022-11-01BillLee023A
2022-10-01BillLee023A
2022-11-01CarterHill555A

期望得到的结果:

Sigdatefnamelnamelocationsigact
2022-11-01BillLee023A
2022-11-01CarterHill555A
解决方案

要实现每个eight_id只取tblSign中的最新记录,可使用**窗口函数ROW_NUMBER()**对每个eight_id的记录按时间排序,筛选出排序为1的最新记录。修改后的SQL如下:

SELECT s.sigdate, s.sigtime, s.sigact, s.esignature, e.fname, e.lname, e.location, e.estatus, l.unit, l.descript, l.addr1, l.city, l.state, l.zip
FROM tblEmpl e
LEFT JOIN (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY eight_id ORDER BY sigdate DESC, sigtime DESC) AS rn
    FROM tblSign
    WHERE formid = '9648'
      AND sigact <> 'O'
      AND sigdate >= '2022-11-01'
) s ON s.eight_id = e.eight_id AND s.rn = 1
LEFT JOIN tblLocs l ON e.location = l.location
WHERE e.estatus = 'A'
  AND e.location = '013'
ORDER BY s.sigdate ASC;

关键说明:

  • 子查询中用PARTITION BY eight_id将记录按eight_id分组,ORDER BY sigdate DESC, sigtime DESC确保每组内按日期、时间倒序排列,最新的记录排在最前面。
  • ROW_NUMBER()为每组内的记录分配序号,rn=1即对应每组的最新记录。
  • 原查询中tblSign的筛选条件移至子查询内,避免关联后筛选导致数据丢失。

内容的提问来源于stack exchange,提问作者TimmyTurn123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:25:18