0

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

IdReg
IdTypeReg
State_prev
Action
State_new
Timestamp

而且我想不出这样的查询:

  • 获取列表IdRegs
  • 在哪里IdTypeReg@type他们的最后State_new一个Timestamp<@Date
  • 最后一个不在State_new('foo','bar')

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

我的意思是...我以前做过,但我似乎不记得是怎么做的。

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

@EDIT:举例说明

假设到2013 年 1 月 1 日,我的最后一个RegId日志000123带有“已结束”

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

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

4

2 回答 2

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')
于 2013-06-26T18:41:18.970 回答
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

有人可以改进一下吗?

于 2013-06-26T18:42:09.877 回答