Access SQL 查询:查找表中每个不同条目的日期最近的行
Posted
技术标签:
【中文标题】Access SQL 查询:查找表中每个不同条目的日期最近的行【英文标题】:Access SQL query: find the row with the most recent date for each distinct entry in a table 【发布时间】:2009-11-09 22:10:34 【问题描述】:全部,
我确信这是一个非常简单的 SQL 查询问题,但我确信有一个好方法,也有一个非常糟糕的方法来做到这一点。留给我自己的设备,我很可能会选择后者。所以……
我在 Access 中有一个表,其中的数据如下所示:
ID Value As_of
1173 156 20090601
1173 173 20081201
1173 307 20080901
1173 305 20080601
127 209 20090301
127 103 20081201
127 113 20080901
127 113 20080601
1271 166 20090201
1271 172 20081201
1271 170 20080901
1271 180 20080601
...
我想获得的是每个唯一 ID 的“值”,以及最近的“截至”日期(格式为 YYYYMM)。
所以,我的结果集应该是这样的:
ID Value As_of
1173 156 20090601
127 209 20090301
1271 166 20090201
请注意,不同的 ID 会有不同的“截止日期”。换句话说,我不能简单地在全球范围内识别最近的日期,然后选择具有该日期的每一行。
不管怎样,这张表总共有大约 200,000 行,以及大约 10,000 个唯一 ID。
提前非常感谢!
【问题讨论】:
【参考方案1】:如果您需要日期和值,则需要进行连接:
SELECT ID, Value,As_of
from yourTable a inner join
(SELECT ID, MAX(As_of) as As_of
from yourTable group by ID) b
on a.ID=b.ID and a.As_of = b.As_of
【讨论】:
Radu - 只是想感谢您的回答 - 完美运行,比我尝试的原始嵌套“Select Max”快约 99.99%。干杯,马特【参考方案2】:@Funka,如果您有不同 ID 的重复“值”值,这将不起作用 - 这基本上会给您一个按“值”分组的列表,而不是按 id...
@Joe Fair,在没有子查询/具有组合的 where 子句中也不允许聚合,至少在 ANSI 中不允许...
这将为您提供列表,但如果您有多行具有相同的 id/As_of 值,也会提供重复项:
select t1.id, t1.value, t1.As_of
from tableName t1
join (
select id as id, max(As_of) as max_as_of
from tableName
group by id
) t2
on t1.id = t2.id
and t1.As_of = t2.max_as_of
如果您想从中删除重复项,您只需在顶部选择中添加一个 distinct,如下所示:
select distinct t1.id, t1.value, t1.As_of
from tableName t1
join (
select id as id, max(As_of) as max_as_of
from tableName
group by id
) t2
on t1.id = t2.id
and t1.As_of = t2.max_as_of
【讨论】:
嗯,他们都是正确的!但不同之处在哪里? :-) Chadhoc - 只是想感谢你的回答 - 它工作得很好。我会把“接受的答案”归功于你,除非我已经把它交给了 Radu 的帖子。不确定协议是什么 - 两个答案都同样有用和正确。和麻烦是同时提交的。【参考方案3】:试试这样的
SELECT t1.*
FROM (SELECT Table1.ID, Max(Table1.As_Of) AS MaxOfAs_Of
FROM Table1
GROUP BY Table1.ID
) AS MaxIDS INNER JOIN Table1 t1 ON MaxIDS.ID = t1.ID
and MaxIDS.MaxOfAs_Of = t1.As_Of
【讨论】:
【参考方案4】:我认为您正在寻找的是:
从 table_name 中选择 id、value、as_of 其中 as_of = max(as_of) 按 id 分组
这表示对于每个 id,找到最大 as_of,并获取该值。
这是通用的 sql。我不确定访问权限。我确定如果这不起作用,还有类似的东西。
祝你好运! 乔
【讨论】:
【参考方案5】:不确定您希望在哪个平台上执行此操作,但在 T-SQL 中您可以执行以下操作:
SELECT t.*
FROM (
SELECT ID, MAX(As_Of) as r1
FROM myTable
GROUP BY ID
) as dt
INNER JOIN myTable t ON dt.ID = t.ID and dt.r1 = t.As_Of
祝你好运!
编辑:好吧,我糟糕的答案困扰着我,所以我已经修复了它,即使这个答案现在已经存在于页面的其他地方。
【讨论】:
抱歉,我确实看到您说 Access 是数据库。我希望这仍然对你有用! 我相信你的意思是按值和 ID 分组,因为他要求按 ID 为最大日期的值。 -1 这甚至没有引用 ID,所以它不能满足需要。它可以嵌套在另一个查询中并且可以正常工作... 我很想知道为什么至少有两个人支持这个答案? Funka,感谢您的回复。但是,这并不是我想要的。我正在尝试使用表中每个唯一 ID 的最大“as_of”日期来识别值。如果我的原始帖子不清楚,我深表歉意。以上是关于Access SQL 查询:查找表中每个不同条目的日期最近的行的主要内容,如果未能解决你的问题,请参考以下文章