解决我的问题,请帮助或指出正确的方向。
我有以下示例表:
HistoricalValue
ID SITEID VAL DATE
1 1 100 9/1
2 1 120 10/1
3 2 300 10/3
4 2 350 10/10
LOG
ID SITEID VAL START_TIME END_TIME CALC
1 1 120 10:10 10:20 (END_TIME-START_TIME)*VAL
HistoricalValue表是我为每个站点输入数据的地方,而LOG表是我输入一些要计算的参数的地方。
我想要的是根据所选的SiteID,自动填充LOG表中的“VAL(ue)”列,其中包含来自HistoricalValue表的最后一个值(按id?或者按日期)。
实现这一目标的正确方法是什么?
提前谢谢。
答案 0 :(得分:0)
最好的方法是允许NULL
val 并动态填写真实值。以下是在SQL Server中执行的,但只需要更改日期操作:
with
HistoricalValue( ID, SiteID, Val, ValDate )as(
select 1, 1, 100, '2015-09-01' union all
select 2, 1, 120, '2015-10-01' union all
select 3, 2, 300, '2015-10-03' union all
select 4, 2, 350, '2015-10-10'
),
LogVal( ID, SiteID, Val, StartTime, EndTime )as(
select 1, 1, 100, '2015-09-01 10:10', '2015-09-01 10:20' union all
select 1, 1, NULL, '2015-10-01 10:10', '2015-10-01 10:20'
)
select l.ID, l.SiteID, l.VAL LogVal, h.ValDate, h.val HistVal,
coalesce( l.VAL, h.val ) as NewVal,
StartTime, EndTime,
DateDiff( SECOND, EndTime, StartTime) * coalesce( l.Val, h.Val ) as CalcVal
from LogVal l
left join HistoricalValue h
on h.SiteID = l.SiteID
and h.ValDate =(
select Max( ValDate )
from HistoricalValue
where SiteID = l.SiteID
and ValDate < l.StartTime
and Val is not null );
我提供了第二个没有 val 值的日志条目,以显示如何检索和使用该条目之前的最新值。我还假设结束和开始时间实际上是日期和时间。时间值,否则您无法分辨日志条目之前的哪些历史条目。
答案 1 :(得分:-1)
您需要执行触发才能自动执行此操作。如果您在插入时没有该值,则可以执行以下操作:
insert into example(val1)
select val1
from example
order by id desc
limit 1;
这假设id
是一个自动递增的列,用于确定&#34; last&#34;插值是。
触发器将是before insert
触发器,基本上运行相同的代码。