我有一个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个结果)。任何帮助将不胜感激。
答案 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)
您可以使用此查询获得所需的Year
和ID
值:
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);