我正在尝试缩小我的数据库,它有很多条目,我想恢复,因为有效价格可以显示在一行中,但显示在很多行中。
样本数据:
时间戳 | 项目 | 价格 | valid_from | 有效期至 |
---|---|---|---|---|
0x949DFFA0 | A001 | 70 | 01/01/2020 | 2020/01/31 |
0x949DFFA1 | A001 | 70 | 02/01/2020 | 2020/04/30 |
0x949DFFA2 | A001 | 70 | 05/01/2020 | 2020/06/30 |
0x949DFFA3 | A001 | 70 | 07/01/2020 | 01/31/2021 |
0x949DFFA4 | A001 | 85 | 02/01/2021 | 06/30/2021 |
0x949DFFA5 | A001 | 85 | 07/01/2021 | 10/31/2021 |
0x949DFFA6 | A001 | 70 | 11/01/2021 | 01/01/2022 |
...应该导致数据:
时间戳 | 项目 | 价格 | valid_from | 有效期至 |
---|---|---|---|---|
0x949DFFA0 | A001 | 70 | 01/01/2020 | 01/31/2021 |
0x949DFFA4 | A001 | 85 | 02/01/2021 | 10/31/2021 |
0x949DFFA6 | A001 | 70 | 11/01/2021 | 01/01/2022 |
我生成了一个表,其中包含由项目和价格组成的人工关键字,以找出 MIN(valid_from) 日期以及 MAX(valid_till) 和 PARTITION BY。但这并不能正常工作,因为有时在短时间内上涨后,后来的价格与几个月前的价格相同。 事实上,如果下一行的价格相同,我将不得不浏览按日期排序的表格并检查。如果是,则必须接管 valid_till 日期并且必须删除下一行。 即使我能够在表格中正确显示数据(我不是),我仍然必须修改和删除相关行。 任何人都可以帮助或提示如何设法修改现有数据和删除备用行吗? 非常感谢
看来我找到了可行的方法:
我选择临时表中的所有数据,这些数据按 valid_from 日期排序,并带有三个附加字段:prevPrice AND prevValidFrom 和 prevTimestamp。
LAG([price], 1,0) OVER (ORDER BY item, [valid_from] ) AS prevPrice,
LAG([valid_from], 1,0) OVER (ORDER BY item, [valid_from] ) AS prevValidFrom,
LAG([timestamp], 1,0) OVER (ORDER BY item, [valid_from] ) AS prevTimestamp
然后我用 price = prevPrice 更新真实数据库中的所有行(按时间戳)并将 valid_from 设置为 prevValidFrom
接下来我删除真实数据库中的所有行(通过 prevTimestamp),价格 = prevPrice
最后删除临时表
这应该有效。