我有一个查看几个表的视图。每个表包含数据的每日快照(如果添加了新内容,则插入之前的所有内容和新内容)。为了获得最新的数据,我建立了一个这样的查询:
Select * from cu.vwmastertable
where processdate = cast(convert(varchar(8),getdate()-1,112) as int)
Processdate是告诉我们每日快照的方式。格式为:20210303.
然而,有些时候数据无法更新。因此,我使用的查询没有返回任何数据。
我试着使用:
Select * from cu.vwmastertable
where processdate = ( select max(process) date from cu.vwmastertable)
但是它运行了一个小时+。
我想用
cast(convert(varchar(8),getdate()-1,112) as int)
如果有数据,如果没有得到前一天
cast(convert(varchar(8),getdate()-2,112) as int)
我该怎么做呢?
你有一个视图,所以我建议使用窗口函数:
select *
from (select m.*, dense_rank() over (order by processdate desc) as seqnum
from cu.vwmastertable m
) m
where seqnum = 1;
你应该能够使这更有效,只选择最近的日期…说最近一周:
select *
from (select m.*, dense_rank() over (order by processdate desc) as seqnum
from cu.vwmastertable m cross join
(values (convert(date, dateadd(day, -7, getdate()))) ) v(dte)
where processdate >= year(v.dte) * 10000 + month(v.dte) * 100 + v.dte
) m
where seqnum = 1;
你也可以添加索引来加速你的版本,但如果不了解实际运行的代码(即视图定义),就不可能提出具体的建议。