[英]First Occurrence of Record by Date
如果他們在用戶指定的日期(這些表單上的字段,如下所示, StartDateTxt
和EndDateTxt
上的字段)之前沒有以前的獎勵日期, 則我試圖返回一個雇員姓名和獎勵日期,也就是它們的“首次出現”。
示例(僅出於簡單起見,AwardTbl):
AwardDate EmployeeID PlanID AwardedUnits
3/1/2005 100200 1 3
3/1/2008 100200 1 7
3/1/2005 100300 1 5
3/1/2013 100300 1 8
如果我跑的日期之間的查詢1/1/2005 - 12/31/2005
,它會返回3/1/2005
和100200
和100300
。 如果我在1/1/2008-12/31/2008
1/1/2013 - 12/31/2013
之間運行查詢,則將不會返回任何內容,並且在1/1/2008-12/31/2008
1/1/2013 - 12/31/2013
也將不返回任何內容,因為這些員工的授予日期早了。
我嘗試了幾種不同的方法,這給了我一些奇怪的結果。
SELECT x.AstFirstName ,
x.AstLastName ,
y.AwardDate ,
y.AwardUnits ,
z.PlanDesc
FROM (AssociateTbl AS x
INNER JOIN AwardTbl AS y ON x.EmployeeID = y.EmployeeID)
INNER JOIN PlanTbl AS z ON y.PlanID = z.PlanID
WHERE y.AwardDate BETWEEN [Forms]![PlanFrm]![ReportSelectSbfrm].[Form]![StartDateTxt] And [Forms]![PlanFrm]![ReportSelectSbfrm].[Form]![EndDateTxt] ;
該查詢不在乎是否有以前的記錄,我認為那是我不確定如何縮小查詢范圍的地方。
我也嘗試過:
Min(AwardDate)
(無效) WHERE
子句中的子查詢,由TOP 1 AwardDate ASC
排序,僅返回1條記錄 DCount("*", "AwardTbl", "AwardDate < [Forms]![PlanFrm]![ReportSelectSbfrm].[Form]![StartDateTxt]") < 1
(這也沒有區分它是否是第一個獎勵日期的發生) 請注意:這是MS Access。 沒有ROW_NUMBER()
或CTE
功能。
嘗試如下
SELECT x.AstFirstName ,
x.AstLastName ,
y.AwardDate ,
y.AwardUnits ,
z.PlanDesc
FROM (AssociateTbl AS x
INNER JOIN AwardTbl AS y
ON x.EmployeeID = y.EmployeeID)
INNER JOIN PlanTbl AS z
ON y.PlanID = z.PlanID
WHERE y.AwardDate BETWEEN '1/1/2005' AND '12/31/2005'
GROUP BY y.EmployeeID,
x.AstFirstName ,
x.AstLastName ,
y.AwardDate ,
y.AwardUnits ,
z.PlanDesc
HAVING COUNT(*) = 1
我相信您需要嵌套選擇。 嵌套查詢將使用Min(awardDate)進行選擇,外部查詢將針對所需的時間段進行過濾。
如果兩者都在同一個查詢中,它將在執行Min(awardDate)並在指定時間內返回Min(awardDate)之前過濾掉結果。
select y.employeeId, y.awardDate from (
select x.employeeId, min(x.awardDate) as awardDate
from AssociateTbl as x
group by x.employeeId) as y
where y.awardDate >= :startAwardDate and y.awardDate < :endAwardDate;
如果在Having
子句中將EmployeeID與您的日期范圍分組並用作過濾器列表,則最小獎勵日期將起作用
SELECT x.AstFirstName ,
x.AstLastName ,
y.AwardDate ,
y.AwardUnits ,
z.PlanDesc
FROM ((AssociateTbl AS x
INNER JOIN AwardTbl AS y ON x.EmployeeID = y.EmployeeID)
INNER JOIN (select a.EmployeeID,min(a.AwardDate) AS MinAwardDate
from AwardTbl AS a
group by a.EmployeeID
having ((min(a.awardDate)>=[Forms]![PlanFrm]![ReportSelectSbfrm].[Form]![StartDateTxt]
and min(a.awardDate)<[Forms]![PlanFrm]![ReportSelectSbfrm].[Form]![EndDateTxt]))
) AS d on d.EmployeeID = x.EmployeeID
and d.MinAwardDate = y.AwardDate)
INNER JOIN PlanTbl AS z ON y.PlanID = z.PlanID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.