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列表。