Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在max(T.<;column>;)上加入,包括T的进一步信息_Sql Server 2008_Tsql - Fatal编程技术网

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

这就是我要找的。谢谢