2017-12-25 6 views
0

に達したとき、私はこのようなテーブルを持つデータベースを持っている時間の見積もり:IDは特定の値

+------+-------------+-----------------------+ 
| ID | DATE  | Data     | 
+------+-------------+-----------------------+ 
| 1 | dd.mm.yyyy | ...     | 
| 2 | dd.mm.yyyy | ...     | 
| 5 | dd.mm.yyyy | ...     | 
| 6 | dd.mm.yyyy | ...     | 
+------+-------------+-----------------------+ 

をここでIDが異なるテーブル間で分割されsequenceから来ています。私はここに継続的に追加されているIDのセット(100百万)で特定のテーブルを使って作業しています。 IDが特定の価値(たとえば10億)に達する時期を予測したいと思います。

これを解決するための質問を書くことができますか(重要な要件:できるだけCASEステートメントが少ない)?

+0

わかりません。ここに行を定期的に挿入していますか(1行/秒など)ですか?将来を予測できるSQL文が必要なように私には聞こえるからです。それを書くことができる人は、無料であなたにそれを与えることはありません。詳しく教えてください。 –

答えて

2

時間的に直線的に成長し、推定することができます。

 .---- E = Expected ID 
     /| 
    /| 
    /| 
    .---|---- L = Last Id = MAX(ID) 
    /| | 
/| | 
/| | 
+---+---+---- F = First ID = MIN(ID) 
D1 D2 Dx 

D1 =最初の日= MIN(DATE)
D2 =最後の日付= MAX(DATE)
Dxを=私たちが得る三角形でプロポーションを用いて推定した日付(結果)

式の変換後
D2 - D1 Dx - D1 
------- = ------- 
L - F  E - F 

   D2 - D1 
Dx = (E - F) * ------- + D1 
       L - F 

操作の順序を変更します。オーバーフローを避けるために掛ける前に、L - Fで割ります。日付の最初のオペランドを日付型に変換します。 SQL

SELECT 
    MIN("DATE") + (1000000000 - MIN(ID))/(MAX(ID) - MIN(ID)) * 
    (MAX("DATE") - MIN("DATE")) AS DateReachedGivenId 
FROM YourTable 

注意として

Dx = D1 + (E - F)/(L - F) * (D2 - D1) 

結果年度が9999より大きい場合、Oracleはエラーを生成すること。これが発生する場合は、最大IDに達するまでの日数を単純に計算できます。

SELECT (1000000000 - MIN(ID))/(MAX(ID) - MIN(ID)) * (MAX("DATE") - MIN("DATE")) AS DaysLeft 
FROM YourTable 
+0

これは線形分布を前提としています。 – MT0

+0

はい、あります。あなたは前提をしなければなりません。挿入の速度が年々変化する場合は、たとえば、昨年のデータだけを使用することもできます。しかし、この期間のMIN(ID)を計算式で考慮する必要があります。 –

+0

もちろん、あなたは「前提を作る必要があります」(OP、または彼のビジネス顧客が、スタックオーバーフローでOPを手助けしようとしている人ではなく、前提を作っていればベストだろう)。しかし、なぜあなたはすべての可能な選択肢の線形性を前提にしていますか?なぜ指数関数的な成長ではないのですか?これはもっと一般的です。 – mathguy

関連する問題