Sql server 按id获取最后一个历史元素

Sql server 按id获取最后一个历史元素,sql-server,tsql,Sql Server,Tsql,我有一个巨大的历史记录表,其中每个包含操作的表都会记录下来 IdReg IdTypeReg State_prev Action State_new Timestamp 我想不出有什么疑问会说: 获取IDREG的列表 其中IdTypeReg是@type 通过时间戳可以使用row\u number执行此操作 WITH cte as ( SELECT IdReg, IdTypeReg, State_prev, Action, State_new, Timesta

我有一个巨大的历史记录表,其中每个包含操作的表都会记录下来

IdReg
IdTypeReg
State_prev
Action
State_new
Timestamp
我想不出有什么疑问会说:

获取IDREG的列表 其中IdTypeReg是@type
通过时间戳可以使用row\u number执行此操作

WITH cte as (
SELECT 
   IdReg,
   IdTypeReg,
   State_prev,
   Action,
   State_new,
   Timestamp,
   ROW_NUMBER() OVER (PARTITION BY IdReg ORDER BY timestamp desc) rn
FROM 
   actions
WHERE
     Timestamp<@Date 

)
SELECT 
   * 
FROM 
   Cte
WHERE RN = 1
   and  State_new NOT IN ('foo','bar')

我做了这个。。。但是我不喜欢它

SELECT DISTINCT t.id
        , h1.timestamp
        , h1.old_state   
        , h1.new_state 

FROM    
myTable t 
JOIN history h1 ON (h1.dbid = t.dbid)
JOIN statedef s on t.state = s.id
JOIN (SELECT haux.dbid id, date = MAX(haux.timestamp)
          FROM    cvuser.history haux
          WHERE   haux.timestamp < @date
          GROUP BY haux.dbid
        ) h2 ON (h2.date = h1.timestamp)
where h1.new_state NOT IN ('ThisOne','ThatOne','TheOther')
ORDER BY t.id desc

有人能改进一下吗?

我以前见过这样的东西。。。似乎它会起作用。。。让我试试!不,如果“foo”是今天最后一个,它仍然会带来它。时间戳过滤器无法完成我需要它做的事情。嗯,我很难理解为什么会发生这种情况。也许你可以在发生这种情况的地方共享一些样本数据,这是因为时间戳使rn=1,无论它是否有任何没有该id的“foo”的注册表,它都会显示最后一个,并且不应该显示任何该id。@apacay if我理解你的问题,你只需要在cte之后而不是之前应用状态新过滤器。我删除了反连接选项,因为它在很大程度上成为了一个PIA,我也不喜欢它。如果没有使用,为什么要加入statedef。你真的打算只在约会时加入h2。和列名与问题不匹配。抱歉,我删除了一些信息。。。在Select Distinct中,我有s.name。。如果我只在日期加入,它只会带来最后的reg 1 reg,而不是我需要的reg列表。