访问选择唯一标识符的最新条目

时间:2013-01-10 21:00:30

标签: ms-access ms-access-2010

我有一个Access表,每个唯一标识符有多个日期条目

Year      ID  TotalSpent
2003-2004 001 1000
2002-2003 001  900
2001-2002 001  100
2009-2010 002 8000
2008-2009 002 4000
2000-2001 003  100
1999-2000 003    0

我想保留每个唯一ID的最新(顶部)条目以生成

Year      ID  TotalSpent
2003-2004 001 1000
2009-2010 002 8000
2000-2001 003  100

我查看了top()函数,但是无法生成多于1​​个结果(而不是每个唯一ID的1个结果)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

Remou提出了一个有效的观点,即一个唯一的ID将是有益的,因为它将允许在未来引用顶行,但这可能是您控制之外的约束。

数据源有点尴尬,带有连字符的年份会阻止简单的分组查询。第二个问题是,您根本不能仅按TotalSpent字段的最大值进行分组,因为它可能不是最后一个字段(例如,大额退款可能会影响总年数)。

我的解决方案是为每个ID(查询A)找到最新的Year,然后将year-tag重新加入表B.我不想在计算字段上执行连接,所以我将它包装在另一个子查询(查询B)。然后将其连接到原始表/查询以提取键行和值。

SELECT YourTable.[YourYearField],
   YourTable.ID,
   YourTable.TotalSpent
FROM   (SELECT A.ID,
           [StartYear] & "-" & [EndYear] AS Grouping
    FROM   (SELECT YourTable.ID,
                   Max(Val(Right$([YourYearField], 4)))     AS EndYear,
                   Max(Val(Right$([YourYearField], 4)) - 1) AS StartYear
            FROM   YourTable
            GROUP  BY YourTable.ID) AS A
    GROUP  BY A.ID,
              [StartYear] & "-" & [EndYear]) AS B
   INNER JOIN YourTable
           ON ( B.Grouping = YourTable.[YourYearField] )
              AND ( B.ID = YourTable.ID )
GROUP  BY YourTable.[YourYearField],
      YourTable.ID,
      YourTable.TotalSpent; 

答案 1 :(得分:0)

您可以使用此查询获得所需的YearID值:

SELECT ID, Max([Year]) AS MaxOfYear
FROM YourTable
GROUP BY ID;

然后,要获取相应的TotalSpent值,请将该SQL用于您加入YourTable的子查询。

SELECT y.Year, y.ID, y.TotalSpent
FROM
    YourTable AS y
    INNER JOIN
        (
            SELECT ID, Max([Year]) AS MaxOfYear
            FROM YourTable
            GROUP BY ID
        ) AS sub
    ON
            (y.Year = sub.MaxOfYear)
        AND (y.ID = sub.ID);