我有一个包含这样的表的数据库:
+------+-------------+-----------------------+
| ID | DATE | Data |
+------+-------------+-----------------------+
| 1 | dd.mm.yyyy | ... |
| 2 | dd.mm.yyyy | ... |
| 5 | dd.mm.yyyy | ... |
| 6 | dd.mm.yyyy | ... |
+------+-------------+-----------------------+
此处ID来自sequence,它在不同的表之间分割。我正在使用一个特定的表,其中包含一组ID(1亿),这些表一直在这里添加。我想估计一个ID何时达到特定值(比如10亿)。
你能帮我写一个解决这个问题的查询(重要的要求:尽可能少的CASE陈述)吗?
答案 0 :(得分:2)
你可以假设线性增长并及时推断。
.---- E = Expected ID
/|
/ |
/ |
.---|---- L = Last Id = MAX(ID)
/| |
/ | |
/ | |
+---+---+---- F = First ID = MIN(ID)
D1 D2 Dx
D1 =第一个日期= MIN(DATE)
D2 =最后日期= MAX(日期)
Dx =估计日期(结果)
使用三角形中的比例:
D2 - D1 Dx - D1
------- = -------
L - F E - F
转换公式后
D2 - D1
Dx = (E - F) * ------- + D1
L - F
在乘法之前更改操作的顺序并除以L - F
以避免溢出。设置日期第一个操作数以获取日期类型作为结果。
Dx = D1 + (E - F) / (L - F) * (D2 - D1)
作为SQL
SELECT
MIN("DATE") + (1000000000 - MIN(ID)) / (MAX(ID) - MIN(ID)) *
(MAX("DATE") - MIN("DATE")) AS DateReachedGivenId
FROM YourTable
请注意,如果结果年份大于9999,Oracle将生成错误。如果发生这种情况,您只需计算剩余的天数,直到达到最大ID为
SELECT (1000000000 - MIN(ID)) / (MAX(ID) - MIN(ID)) * (MAX("DATE") - MIN("DATE")) AS DaysLeft
FROM YourTable