我有两张桌子
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进行测试。
答案 0 :(得分:3)
您可以使用row_number
分区的itemid
,ts desc
订购itemstatus
,itemid
每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
进行最新注册。
{{1}}