加入max(T。<column>),包括T </column>的更多信息

时间:2014-01-24 09:32:33

标签: sql-server-2008 tsql

我有两张桌子

create table item( id int )
insert into item ( id ) values ( 1 ), ( 2 ), ( 3 )

create table itemstatus
(
    itemid int 
    , ts datetime
    , "status" int
)

insert into itemstatus ( itemid, ts, status ) values 
( 1, '2013-12-01T12:00:00.000', 1 ),
( 1, '2013-12-01T11:00:00.000', 2 ),
( 1, '2014-01-01T12:00:00.000', 1 ),
( 2, '2011-01-01T12:00:00.000', 1 )

我想获取所有设置了最后状态的项目,在本例中为

1, '2014-01-01T12:00:00.000', 1
2, '2011-01-01T12:00:00.000', 1
3, NULL, NULL

解决这个问题的最有效方法是什么?

我尝试使用subselect并获得最新的时间戳,但我无法添加状态,因为此字段未包含在aggregate-function或group-by中。如果我添加它,结果按状态分组 - 逻辑上 - 但这导致事实,我得到太多的结果行,并且必须添加进一步的条件/子选择。

您可以使用Fiddle-link创建表和testdata。第二个查询包括status-field。

编辑:

添加进一步的连接可以解决这个问题,但我怀疑这是否可行。

select 
    i.*
    , d.*
    , s.status
from
    item i
    left join ( select ts = max(ts), itemid from itemstatus group by itemid ) d
        on 1 = 1 
        and i.id = d.itemid
    left join itemstatus s
        on 1 = 1
        and s.itemid = d.itemid
        and s.ts = d.ts

请参阅SQL-fiddle进行测试。

1 个答案:

答案 0 :(得分:3)

您可以使用row_number分区的itemidts desc订购itemstatusitemidselect I.id, S.ts, S.status from item as I left outer join ( select S.status, S.ts, S.itemid, row_number() over(partition by S.itemid order by S.ts desc) as rn from itemstatus as S ) as S on I.id = S.itemid and S.rn = 1 进行最新注册。

{{1}}