在日期加入两个表,其中右表的日期大于左表的日期,但小于右表中的下一个最大日期

时间:2015-10-23 21:47:53

标签: ms-access

MS-ACCESS问题:我们有出院日期和查询日期。我们需要在每次放电后进行查找。当然,问题是当有两次放电和两次查找时会发生什么,但是在两次查找都在第二次放电之后,两次查找中的一次是否计入第一次放电?我们的政策是不,不是。换句话说,如果查询在出院日期之后但在下一个出院日期之前,查找日期仅与出院日期有关。

我的问题似乎与Join two tables where table A has a date value and needs to find the next date in B below the date in A相似,但这个问题只是寻找下一个最高日期,而我的标准则更为复杂。

我有两张桌子:
带字段DDate的 tblDischarge DDate
2015年7月1日
2015年7月5日
2015年7月20日

tblLookup ,字段为LDate
LDate
2015年7月2日
2015年7月3日
2015年7月23日
2015年7月25日

根据规则,我需要得到:
DDate | LDate
2015年7月1日| 2015年7月2日
2015年7月1日| 2015年7月3日
2015年7月20日| 2015年7月23日
2015年7月20日| 2015年7月25日

请注意,2015年7月5日的DDate没有匹配项,因为大于2015年7月5日的查找大于2015年7月20日的下一个最高DDate。

我没有走得太远。我有:

SELECT tblDischarge。[DDate],[tblLookup]。[LDate]
FROM tblDischarge INNER JOIN tblLookup ON([tblLookup]。[LDate]> tblDischarge。[DDate] AND([tblLookup]。[LDate]> MIN(tblDischarge。[DDate]> [tblLookup]。[LDate])) ;

我正在寻找ON子句的其余部分。我使用的是IIF,但我认为这比它需要的更复杂。 我认为我只需要AND"将LDate与DDate的MIN进行比较的事情> LDate&#34 ;.我目前在AND之后有点,但它显然很糟糕而且无法正常工作。

关于如何运作的任何想法?

编辑添加完整的表格及其真实情况:

tblDischarge

+-----------+---------+---------+------------+-------+
|   DDate   | D_FName | D_LName |   D_DOB    | D_Sex |
+-----------+---------+---------+------------+-------+
| 7/1/2015  | Joe     | Blow    | 12/12/2012 | M     |
| 7/5/2015  | Joe     | Blow    | 12/12/2012 | M     |
| 7/20/2015 | Joe     | Blow    | 12/12/2012 | M     |
| 7/3/2015  | Jane    | Doe     | 8/8/1974   | F     |
| 7/6/2015  | Jane    | Doe     | 8/8/1974   | F     |
| 7/15/2015 | Bill    | Nobody  | 5/5/1955   | M     |
| 7/12/2015 | Irene   | Dover   | 3/17/1942  | F     |
+-----------+---------+---------+------------+-------+

tblLookup

+------------------------------------------------------+  
¦   LDate   ¦ L_FName ¦ L_LName ¦   L_DOB    ¦ L_Sex   ¦  
¦-----------+---------+---------+------------+---------¦  
¦ 7/2/2015  ¦ Joe     ¦ Blow    ¦ 12/12/2012 ¦ M       ¦  
¦ 7/3/2015  ¦ Joe     ¦ Blow    ¦ 12/12/2012 ¦ M       ¦  
¦ 7/23/2015 ¦ Joe     ¦ Blow    ¦ 12/12/2012 ¦ M       ¦  
¦ 7/25/2015 ¦ Joe     ¦ Blow    ¦ 12/12/2012 ¦ M       ¦  
¦ 7/7/2015  ¦ Jane    ¦ Doe     ¦ 8/8/1974   ¦ F       ¦  
¦ 7/11/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
¦ 7/11/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
¦ 7/21/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
¦ 7/28/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
¦ 7/30/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
¦ 7/31/2015 ¦ Irene   ¦ Dover   ¦ 3/17/1942  ¦ F       ¦  
+------------------------------------------------------+  

我尝试编辑派生表以使查询看起来像这样:

SELECT DerivedTable.DDate, DerivedTable.LDate, DerivedTable.D_FName, DerivedTable.D_LName, DerivedTable.D_DOB, DerivedTable.D_Sex, DerivedTable.NextDDate
FROM (SELECT tblDischarge.DDate, tblLookUp.LDate, Nz((SELECT TOP 1 t2.DDate FROM tblDischarge t2 WHERE t2.DDate > tblDischarge.DDate),DateAdd('d',30,tblDischarge.DDate)) AS NextDDate, tblDischarge.D_FName, tblDischarge.D_LName, tblDischarge.D_DOB, tblDischarge.D_Sex FROM tblDischarge INNER JOIN tblLookUp ON (tblDischarge.D_FName = tblLookUp.L_FName) AND (tblDischarge.D_LName = tblLookUp.L_LName) AND (tblDischarge.D_DOB = tblLookUp.L_DOB) AND (tblDischarge.D_Sex = tblLookUp.L_Sex) WHERE (((tblDischarge.DDate)<[tblLookUp].[LDate])))  AS DerivedTable
WHERE (((DerivedTable.LDate)<[NextDDate]));

但那是让我错误的NextDate。

我正在寻找的是:对于每个人,哪个出院日期的查询日期晚于出院日期但不晚于同一个人的下一个出院日期。我定义人的方式是匹配first,last,sex和dob。

因此,在样本数据中,Joe Blow的7/1和7/20排放进行了削减,但不是7/5。对于Jane Doe来说,只有7/6放电才能完成切割,而对于Irene来说,7/11放电就是这样。当然,比尔没有出现,因为他没有查找。

1 个答案:

答案 0 :(得分:1)

使用子查询和派生表来考虑这种多方面的方法。

首先,不需要使用连接。只需从交叉连接查询开始,该查询列出FROM子句中的表,返回DDateLDate的所有可能组合。然后,使用DDate < LDate过滤任何记录的交叉连接。

然后,使用子查询来计算NextDDate。现在,如果最后一条记录的下一个日期没有返回NULL,请使用NZ()任意给它一个上限(此处提前30天)。最后,派生表用于再运行一个WHERE子句以返回LDate < NextDDate

SELECT DDate, LDate    
FROM
   (SELECT tblDischarge.DDate,    
           tblLookup.LDate,    
           Nz((SELECT TOP 1 t2.DDate FROM tblDischarge t2 
               WHERE t2.DDate > tblDischarge.DDate), 
             DateAdd('d', 30, tblDischarge.DDate)) As NextDDate    
    FROM tblDischarge, tblLookUp 
    WHERE tblDischarge.DDate < tblLookUp.LDate
) As DerivedTable    
WHERE LDate < NextDDate

OUTPUT(以您的数据为例):

DDate       LDate
7/1/2015    7/2/2015
7/1/2015    7/3/2015
7/20/2015   7/23/2015
7/20/2015   7/25/2015

<强> ------ ------ EDIT

要合并详细信息(FName,LName,DOB,Sex),请参阅更新的查询:

派生表(可以包含在FROM子句中或作为外部保存的查询)。通过修改嵌套子查询来保证INNER JOIN

    SELECT tblDischarge.D_FName AS FName, tblDischarge.D_LName AS LName, 
           tblDischarge.D_DOB AS DOB, tblDischarge.D_Sex AS Sex, 
           tblDischarge.DDate, tblLookUp.LDate, 
           Nz((SELECT TOP 1 t2.DDate 
                 FROM tblDischarge t2 
                WHERE t2.DDate > tblDischarge.DDate 
                  AND t2.D_FName = tblDischarge.D_FName 
                  AND t2.D_LName = tblDischarge.D_LName),
              DateAdd('d',30,tblDischarge.DDate)) AS NextDDate
      FROM tblDischarge 
INNER JOIN tblLookUp ON (tblDischarge.D_FName = tblLookUp.L_FName)
       AND (tblDischarge.D_LName = tblLookUp.L_LName)
       AND (tblDischarge.D_DOB = tblLookUp.L_DOB) 
       AND  (tblDischarge.D_Sex = tblLookUp.L_Sex)
     WHERE (((tblDischarge.DDate) < [tblLookUp].[LDate]));

最终查询

SELECT FName, LName, DOB, Sex, DDate, LDate
FROM DerivedTable
WHERE LDate < NextDDate
ORDER BY LName, LDate;

输出

FName   LName   DOB        Sex  DDate       LDate
Joe     Blow    12/12/2012  M   7/1/2015    7/2/2015
Joe     Blow    12/12/2012  M   7/1/2015    7/3/2015
Joe     Blow    12/12/2012  M   7/20/2015   7/23/2015
Joe     Blow    12/12/2012  M   7/20/2015   7/25/2015
Jane    Doe     8/8/1974    F   7/6/2015    7/7/2015
Irene   Dover   3/17/1942   F   7/11/2015   7/21/2015
Irene   Dover   3/17/1942   F   7/11/2015   7/28/2015
Irene   Dover   3/17/1942   F   7/11/2015   7/30/2015
Irene   Dover   3/17/1942   F   7/11/2015   7/31/2015