簡體   English   中英

按日期的第一次出現

[英]First Occurrence of Record by Date

如果他們在用戶指定的日期(這些表單上的字段,如下所示, StartDateTxtEndDateTxt上的字段)之前沒有以前的獎勵日期, 我試圖返回一個雇員姓名和獎勵日期,也就是它們的“首次出現”。

示例(僅出於簡單起見,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/2005100200100300 如果我在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] ;

該查詢不在乎是否有以前的記錄,我認為那是我不確定如何縮小查詢范圍的地方。

我也嘗試過:

  1. Min(AwardDate) (無效)
  2. WHERE子句中的子查詢,由TOP 1 AwardDate ASC排序,僅返回1條記錄
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM