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 查询:查找表中每个不同条目的日期最近的行的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:为表中的每个条目生成报告

SQL 更新表中的所有条目,但在列上插入不同的值

在 postgresql 表中查找最大条目,sql

自动将不同表中的 ID 号添加到新条目中?

sql查询 如何获取查找某ID的一条记录在表中是第几条记录

Access 2016 SQL:查找不同表的两列之间的最小绝对差