【问题标题】:How to get the most recent record of multiple of the same records in a table while joining another table?如何在连接另一个表时获取表中多个相同记录的最新记录?
【发布时间】:2022-11-18 01:21:53
【问题描述】:
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;

我的表 Sign 有多个具有相同 eight_id 的记录,所以我只是想连接表,除了多个记录之外,还从 tblSign 获取最新记录

我得到的数据

Sigdate fname lname location sigact
2022-11-01 Bill Lee 023 A
2022-10-01 Bill Lee 023 A
2022-11-01 Carter Hill 555 A

这就是我要的 :

Sigdate fname lname location sigact
2022-11-01 Bill Lee 023 A
2022-11-01 Carter Hill 555 A

【问题讨论】:

  • 没有数据我们无法理解您的结构,或者您希望从缺失数据中得到什么结果
  • 一秒钟@nbk 即将发布
  • 现在检查我更新@nbk

标签: sql sql-server


【解决方案1】:

从养成更好的代码编写习惯开始。将所有列名都放在一个长字符串中对于可读性和故障排除来说是很糟糕的。您可以使用 ROW_NUMBER 函数从表中选择最近的记录。我拿了你的代码,清理了它,添加了一个派生表,并在派生表中添加了一个ROW_NUMBER函数。我无法验证查询是否有效,因为您没有发布来自 tblEmpl、tblSign 和 tblLocs 表的示例源数据。我不确定 AND tblSign.sigact &lt;&gt; 'O' 在派生表中是否有效,因为不清楚您是想限制日期范围还是试图检索最近的日期。

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 (
        SELECT *

            --Used to order the records for each eight_id by the date. 
            --Most recent date for each eight_id will have row_num = 1.
            , ROW_NUMBER() OVER(PARTITION BY eight_id ORDER BY sigdat DESC) as row_num
        FROM tblSign as ts
        WHERE tblSign.formid = '9648'
            AND tblSign.sigact <> 'O'
            AND tblSign.sigdate >= '2022-11-01' --Not clear if this is just to limit results or an attempt to get most recent date in the failed original code.
    ) as ts
        ON ts.eight_id = tblEmpl.eight_id
        AND ts.row_num = 1  --Use to limit to most recent date.
    LEFT JOIN tblLocs
        ON tblEmpl.location = tblLocs.location
WHERE tblEmpl.estatus = 'A'
    AND tblEmpl.location = '013'
ORDER BY
    tblSign.sigdate ASC

【讨论】:

    【解决方案2】:

    您使用 ROW_NUMBER 获取我案例中每个签名的最后一个条目,因为我认为这一定是唯一的

    WITH CTE AS
    (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,
        ROW_NUMBER() OVER(PARTITION BY tblSign.esignature ORDER BY tblSign.sigdate DESC) rn
    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')
    SELECT     sigdate,
        sigtime,
        sigact,
        esignature,
        fname,
        lname,
        location,
        estatus,
        unit,
        descript,
        addr1,
        city,
        state,
        zip
    WHERE rn = 1
    ORDER BY sigdate ASC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2020-06-17
      • 2013-04-03
      • 2014-11-03
      • 2020-10-09
      • 2014-03-08
      相关资源
      最近更新 更多