Sqlite从id匹配的另一个表中插入最后一个值

时间:2015-10-12 02:18:57

标签: sql sqlite database-design triggers

解决我的问题,请帮助或指出正确的方向。

我有以下示例表:

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?或者按日期)。

实现这一目标的正确方法是什么?

提前谢谢。

2 个答案:

答案 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触发器,基本上运行相同的代码。