【发布时间】:2020-06-24 18:29:09
【问题描述】:
网站上有一些类似的问题,但我相信我的问题值得新帖,因为需要纳入特定条件。
我有一个每月间隔的表格,结构如下:
+----+--------+--------------+--------------+
| ID | amount | interval_beg | interval_end |
+----+--------+--------------+--------------+
| 1 | 10 | 12/17/2017 | 1/17/2018 |
| 1 | 10 | 1/18/2018 | 2/18/2018 |
| 1 | 10 | 2/19/2018 | 3/19/2018 |
| 1 | 10 | 3/20/2018 | 4/20/2018 |
| 1 | 10 | 4/21/2018 | 5/21/2018 |
+----+--------+--------------+--------------+
我发现有时在我知道应该存在的年末/年初左右缺少一个月的数据,如下所示:
+----+--------+--------------+--------------+
| ID | amount | interval_beg | interval_end |
+----+--------+--------------+--------------+
| 2 | 10 | 10/14/2018 | 11/14/2018 |
| 2 | 10 | 11/15/2018 | 12/15/2018 |
| 2 | 10 | 1/17/2019 | 2/17/2019 |
| 2 | 10 | 2/18/2019 | 3/18/2019 |
| 2 | 10 | 3/19/2019 | 4/19/2019 |
+----+--------+--------------+--------------+
我需要的是一个声明:
- 确定缺少此年终期间的位置(但未发现缺少 不是在年初/年末的月份)。
- 使用现有间隔的长度创建此间隔 该ID(也许使用ID的平均间隔长度来做到这一点?)。我可以从上一个和下一个间隔之间的“间隙”创建间隔,除非如果我在 ID 记录的开头或结尾缺少一个间隔(即如果记录从 1/16 开始/2015,我需要 12/15/2014-1/15/2015 的金额
- 使用每日平均值为此间隔插入一个“数量” 'amount' 来自最接近的现有区间。
上述示例的最终结果应如下所示:
+----+--------+--------------+--------------+
| ID | amount | interval_beg | interval_end |
+----+--------+--------------+--------------+
| 2 | 10 | 10/14/2018 | 11/14/2018 |
| 2 | 10 | 11/15/2018 | 12/15/2018 |
| 2 | 10 | 12/16/2018 | 1/16/2018 |
| 2 | 10 | 1/17/2019 | 2/17/2019 |
| 2 | 10 | 2/18/2019 | 3/18/2019 |
+----+--------+--------------+--------------+
'nice to have' 是一个标志,表示该值已被插值。
有没有办法在 SQL 中有效地做到这一点?我在 SAS 中编写了一个解决方案,但需要将其移至 SQL,并且我的 SAS 解决方案效率非常低(优化不是目标,所以任何符合我需要的语句都很棒)。
编辑:我在这里用我的示例表制作了一个 SQLFiddle:
【问题讨论】:
-
请标记一个 DBMS(Oracle、MySQL 等)。任何答案都需要针对您特定的 SQL 方言。
-
参见:Why should I provide an MCRE for what seems to me to be a very simple SQL query? - 但考虑处理应用程序代码中的数据显示问题
-
谢谢!我可能措辞不正确,因为我对 SQL 不是很熟悉(因此我要求解决应该是一个非常简单的过程的解决方案)。我不需要仅仅从数据库中查询,我想写入表,以便将这些信息存储在数据库中。我想要一个标志,以便我可以轻松返回并确定哪些值是插值的,哪些是“原始的”。
-
您的小提琴是 MySQL,但问题标记为 SQL server。哪一个?小提琴中样本数据的预期输出是什么?
-
@AlJones1816 你的小提琴比你的问题有更多的数据。我只是想弄清楚您希望查询为小提琴中的数据生成哪些间隔。
标签: sql sql-server date time-series interpolation