获取id last history元素

时间:2013-06-26 18:29:18

标签: sql-server tsql

我有一个巨大的历史记录表,每个带有“动作”的表都会记录

IdReg
IdTypeReg
State_prev
Action
State_new
Timestamp

我无法想到一个查询:

  • 获取IdRegs
  • 的列表
  • 其中IdTypeReg@type的最后State_newTimestamp<@Date
  • 最后State_new不在('foo','bar')

这意味着如果每个ID的表历史记录中的最后一个寄存器位于'foo'或'bar',则此reg不会显示。

我的意思是......我以前做过,但我似乎无法回忆起如何做到。

我可以说不允许使用游标,也不允许使用时态表,也不能使用太多的子选择。

@EDIT:通过示例澄清

让我们说 2013年1月1日我的最后注册日志 000123 '结束' < / p>

如果我将'2013年1月2日'放在参数 @date 上,不应显示 reg id 000123是否处于Whenevember的“工作”状态。

它在@date之前结束,所以我不希望它在我的列表中。

2 个答案:

答案 0 :(得分:2)

您可以使用row_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')

答案 1 :(得分:0)

我已经做到了......但我不喜欢它

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

有人可以改善这一点吗?