我有一个巨大的历史记录表,每个带有“动作”的表都会记录
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日我的最后注册日志 000123 ,'结束' < / p>
如果我将'2013年1月2日'放在参数 @date 上,不应显示 reg id 000123是否处于Whenevember的“工作”状态。
它在@date之前结束,所以我不希望它在我的列表中。
答案 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
有人可以改善这一点吗?