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放电就是这样。当然,比尔没有出现,因为他没有查找。
答案 0 :(得分:1)
使用子查询和派生表来考虑这种多方面的方法。
首先,不需要使用连接。只需从交叉连接查询开始,该查询列出FROM
子句中的表,返回DDate
和LDate
的所有可能组合。然后,使用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