Sql server 2008 在max(T.<;column>;)上加入,包括T的进一步信息
我有两张桌子Sql server 2008 在max(T.<;column>;)上加入,包括T的进一步信息,sql-server-2008,tsql,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.0
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,得到了最新的时间戳,但我无法添加状态,因为此字段未包含在聚合函数或group by中。如果我添加它,结果会按状态分组-逻辑上-但这导致了一个事实,即我得到了太多的结果行,并且必须添加进一步的条件/子选择
您可以使用Fiddle链接来创建表和测试数据。第二个查询包括status字段
编辑:
添加一个进一步的连接确实有效,但我怀疑这是解决问题的方法
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
有关测试,请参阅。您可以使用
行编号按itemid
分区并按ts desc
排序,以按照itemid
在itemstatus
中获取最新注册
select 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
这就是我要找的。谢谢