【问题标题】:how to get a record based on max date for each user in different multiple tables如何根据不同多个表中每个用户的最大日期获取记录
【发布时间】:2020-11-11 12:38:39
【问题描述】:

我正在尝试进行可以选择名称的查询,DateOfSpecimenResult、SwabResult、DateOfReleaseOfResult。这是视觉表示:

表格:ContactTracingHeader

| AutoID |   Name  | 
    1       Jason
    2       Chris

表:拭子

| PatientNo | DateOfSpecimenCollection | SwabResultID | DateOfReleaseOfResult |
      1             05/02/2020                1               05/10/2020
      1             06/08/2020                1               06/11/2020
      1             07/16/2020                2               07/20/2020

注意:ContactTracingHeader.AutoID = Swab.PatientNo

表格:SwabResult

| AutoID | SwabResult |
     1      POSITIVE
     2      NEGATIVE

我正在尝试制作的查询输出

| AutoID |  Name  | DateOfSpecimenCollection | SwabResult | DateOfReleaseOfResult |
     1     Jason          07/16/2020            NEGATIVE          07/20/2020
     2     Chris          (BLANK)               (BLANK)            (BLANK)

注意:Swab.ResultID = SwabResult.AutoID

在这里,我只是想用最新的DateOfSpecimenCollection 显示Name,然后将其用作另外两列SwabResultDateOfReleaseOfResult 的参考,并且由于“Chris”没有Swab 表上没有输入,他的记录是空白的,但他的名字和AutoID 仍然出现在表上。 SwabResult 显示 NEGATIVEPOSITIVE,具体取决于表 Swab 中的 ID。

到目前为止我所做的是:

SELECT
CTH.AutoID, 
CTH.Firstname, 
CTH.Lastname, 

(SELECT MAX(DateOfSpecimenCollection)
            FROM Swab
            WHERE Swab.PatientNo = CTH.AutoID
        ) AS DateOfSpecimenCollection,

Swab.SwabResultID,

Swab.DateOfReleaseOfResult

FROM ContactTracingHeader AS CTH LEFT JOIN Swab ON Swab.PatientNo = CTH.AutoID;

此查询获取最新的 DateOfSpecimenCollection 并输出那些不在 Swab 表中的人,这是正确的,但是它会根据有多少 SwabResultDateOfReleaseOfResult 复制记录.我还尝试了INNER JOINSwabResult 所以我可以输出SwabResult 而不是 ID,但是它给了我 JOIN Expression not supported 错误。

对于冗长而令人困惑的解释和重复的问题,我深表歉意,因为我正努力在互联网上寻找一些答案。谢谢!

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    需要在 Swab 表中的唯一标识符。如果还没有,自动编号应该服务

    考虑:

    查询1:

    SELECT Swab.* FROM Swab WHERE ID IN 
       (SELECT TOP 1 ID FROM Swab AS Dupe WHERE Dupe.PatientNo=Swab.PatientNo 
        ORDER BY Dupe.DateOfSpecimenCollection DESC);
    

    查询2

    SELECT ContactTracingHeader.AutoID, ContactTracingHeader.Name, Query1.DateOfSpecimenCollection, 
    SwabResult.SwabResult, Query1.DateOfReleaseOfResult
    FROM ContactTracingHeader LEFT JOIN (SwabResult RIGHT JOIN Query1 
    ON SwabResult.AutoID = Query1.SwabResultID) 
    ON ContactTracingHeader.AutoID = Query1.PatientNo;
    

    或者这个序列:

    查询1:

    SELECT Swab.PatientNo, Max(Swab.DateOfSpecimenCollection) AS MaxOfDateOfSpecimenCollection
    FROM Swab
    GROUP BY Swab.PatientNo;
    

    查询2:

    SELECT Swab.PatientNo, Swab.DateOfSpecimenCollection, Swab.SwabResultID, 
    Swab.DateOfReleaseOfResult
    FROM Query1 INNER JOIN Swab 
    ON (Query1.MaxOfDateOfSpecimenCollection = Swab.DateOfSpecimenCollection) 
    AND (Query1.PatientNo = Swab.PatientNo);
    

    查询3:

    SELECT ContactTracingHeader.AutoID, ContactTracingHeader.Name, 
    Query2.DateOfSpecimenCollection, SwabResult.SwabResult, Query2.DateOfReleaseOfResult
    FROM SwabResult RIGHT JOIN (ContactTracingHeader LEFT JOIN Query2 
    ON ContactTracingHeader.AutoID = Query2.PatientNo) 
    ON SwabResult.AutoID = Query2.SwabResultID;
    

    【讨论】:

    • 我知道你需要两个查询,我一直强迫自己使用一个查询。当我看到这些参数值时,我以为我遇到了一些错误。非常感谢!
    • 可以将第一个查询嵌套在第二个查询中以实现一体化语句。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2023-01-22
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多