访问SQL查询:查找表中每个不同条目的最近日期的行

时间:2009-11-09 22:10:34

标签: sql ms-access

全部,

我确信这是一个非常简单的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。

非常感谢提前!

5 个答案:

答案 0 :(得分:8)

如果您需要日期和值,则需要进行加入:

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

答案 1 :(得分:4)

@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

如果你想从中删除重复项,你只想在顶部选择中添加一个不同的选项,如下所示:

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

答案 2 :(得分:1)

尝试这样的事情

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

答案 3 :(得分:0)

不确定您要在哪个平台上执行此操作,但在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
祝你好运!

编辑:好吧,我糟糕的回答困扰着我,所以我已经修好了,尽管这个答案已经存在于页面的其他地方了。

答案 4 :(得分:0)

我认为您正在寻找的是:

从table_name中选择id,value,as_of 其中as_of = max(as_of) 按ID分组

这表示对于每个id,找到max as_of,并获得该值。

这是通用的sql。我不确定访问权限。我敢肯定,如果这不起作用,那就有类似的东西了。

祝你好运! 乔