2011-12-29 19 views
0

以下のクエリを解決するのに手伝ってください。 データが3行のテーブル名(Date1、Date2、visitウィンドウ)があるとします。訪問ウィンドウの値を計算する必要があります。これは、日付1の(n + 1)行目と日付2のn行目の違いでなければなりません。例:Date1の2行目の値とdate2の値の1行目の差を7で割った値。最後の行のために異なる行と列の値の差を計算する

Table: Data 
------------ 
Date1   Date2   VW 
13-DEC-2011  15-DEC-2011  ? 
18-DEC-2011  16-DEC-2011  ? 
21-DEC-2011  24-DEC-2011  ? 

おかげ

+3

あなたはどのようなDBMSを使用していますか?あなたのテーブルには、ある種のプライマリキーがありますか? Date1とDate2のデータ型は何ですか?どのような行が最初の行であるかをどのように知っていますか?それはDate1の最も低い値を持つ行ですか? –

+0

Oracle 11gを使用します。データ型はDateです。 これは主キーを持つことができ、date1にもより少ない日付を持つことができます。訪問のウィンドウの値を取得するためのサンプルクエリが必要です。まだ実装されていない単なるパズルです。 – shubcbe

+1

'lead'関数を見てください。次の行のデータにアクセスするために使用され、その値を使用して現在の行と次の行の差を計算できます。 –

答えて

4
select 
    Date1, 
    Date2, 
    lead(Date1) over (order by Date1) next_date1, 
    ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff 
From DATA_TABLE 

一切のn + 1日付1が存在しないので、あなたは、任意のVWを取得することはありません。

lead(column)関数は、over節に指定されている次の行からcolumnパラメータの値を返します。

例とその他の同様の機能があります。here

UPDATE(質問コメントへの応答 - どのように他の列と比較する)

select 
    Date1, 
    Date2, 
    Diff, 
    another_column, 
    CASE 
    when Diff < another_column then 'it is lower' 
    when Diff > another_column then 'it is higher' 
    when Diff = another_column then 'are equal' 
    END as comparation, 
    CASE 
    when round(diff -another_column,3) = 0 then 'almost equal' 
    else 'definitely not equal' 
    END as rounded_comparation 
from(
    select 
     Date1, 
     Date2, 
     lead(Date1) over (order by Date1) next_date1, 
     ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff, 
     another_column 
    From DATA_TABLE 
) 
+0

どうすれば7分で分けて追加できますか?テーブル内のすべての行の値を取得します。この場合、Lead関数がどのように機能するかをもう1つのクエリで説明できます。はい、最後の行は条件のために値を取得しません。どうもありがとう。 – shubcbe

+0

私は自分の答えを更新しました。それがどのように動作するかを見るためにnext_date1という列を追加しました。 –

+0

ありがとうたくさんのフロラン:) – shubcbe

関連する問題