估算ID达到特定值时的时间

时间:2017-12-25 22:16:12

标签: sql oracle

我有一个包含这样的表的数据库:

+------+-------------+-----------------------+
| 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陈述)吗?

1 个答案:

答案 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