我需要将值从一个表提取并迁移到另一个表。源表包含特定生效日期的汇总值。如果一个值被改变了,如果组件值被改变了,那么在这个生效日期开始的数据有效,将会写一行。
source_id | entity_id | effecve_date | component_1 | component_2 | component_3 | int (ai) | int | 日期 | int | int | int | 1
---|---|---|---|---|---|
159 | 2020-01-01 | 100 | 0 | 90 | |
159 | 2020-05-01 | 140 | 50 | 90 | |
3 | 159 | 2020-08-01 | 0 | 30 | 90 |
159 | 2020-12-01 | 0 | 30 | 50 |
表component_final
中不需要enddate
列,因为它的值取决于同一表中的其他值:
SELECT
id,
source_id,
entity_id,
startdate,
( SELECT DATE_ADD(MIN(cf2.startdate),INTERVAL -1 DAY)
FROM component_final cf2
WHERE cf2.startdate > cf1.startdate
AND cf2.source_id = cf1.source_id
AND cf2.entity_id = cf1.entity_id
) as enddate,
component_type,
value
FROM component_final cf1;
我理解核心问题是如何找到组件变化的source_id
s(0意味着删除,所以我们不希望这些条目出现在结果中)以及如何同时分配各自的结束日期。为了便于说明,我将您的示例简化了一点:
- 只有一个
component_type
(我考虑到可能有连续的条目具有不变的值) - 只有一个
entity_id
,所以我们可以忽略它
将这个更简单的版本扩展到您的实际问题应该很容易。
这是一个示例输入:
source_id | effecve_date | value | 1 | 2020-01-01 | 100 | 2
---|---|---|---|
2020-01-03 | 100 | ||
3 | 2020-01-05 | 80 | |
2020-01-10 | 0 | ||
2020-01-12 | 30 |