This answer告诉我如何从数据中获取年度变化:
UPDATE values_table as a
join values_table as b
ON b.date_sampled = DATE_SUB(a.date_sampled, INTERVAL 1 YEAR)
set a.annual_change = a.sample_value - b.sample_value
this answer向我展示了如何找到最接近INTERVAL
的日期(相对于NOW()
,结果为3个结果,在此问题中):
SELECT event_id FROM Table ORDER BY ABS( DATEDIFF( EVENT_START_DATE, NOW() ) ) LIMIT 3
当日期有漏洞时,两者如何合并以获得年度变化率,SELECT
最接近期望INTERVAL
的日期?
我终于有机会尝试戈登的答案,但我得到了Error in query (1054): Unknown column 'vt.date_sampled' in 'where clause'
。
我还尝试在ON b.date_sampled =
之后根据上面的第二个答案做一个子查询,但它给出了Error in query (1064): Syntax error near 'SELECT date_sampled FROM values_table ORDER BY ABS( DATE_SUB(a.date_sampled, INT'
。
答案 0 :(得分:2)
MySQL使得很难在update
语句中引用更新表,但可以使用子查询。
我认为“一年前最近的日期”是相关子查询的一个很好的候选者:
UPDATE values_table vt
set vt.annual_change = vt.sample_value -
(select sample_value
from (select sample_value, date_sampled
from values_table vt2
where vt2.date_sampled <= DATE_SUB(vt.date_sampled, INTERVAL 1 YEAR)
) t
order by date_sampled desc
limit 1
)
我认为你真的想要一个至少一年的日期。但是如果你想要最接近的日期,那么同样的想法也会起作用:
UPDATE values_table vt
set vt.annual_change = vt.sample_value -
(select sample_value
from (select sample_value, date_sampled
from values_table vt2
where vt2.date_sampled <= DATE_SUB(vt.date_sampled, INTERVAL 1 YEAR)
) vt2
order by ABS( DATEDIFF(vt.date_sampled, vt2.date_sampled))
limit 1
)