2012-03-28 10 views
1

に次の日付値を検索:私は、次の列とサンプル値と大きなテーブルを持つ列

ID Ser  Reg Date 
1 12345 001 1/3/2011 
1 12345 001 2/2/2011 
1 12345 002 1/3/2011 
1 12345 002 2/2/2011 
2 23456 001 1/3/2011 
2 23456 001 2/7/2011 
2 23456 001 3/5/2011 

私は、以前のポストSQLからこのクエリを試してみました - 次の日付のクエリを選択します - しかし、取得できませんでした希望する結果:

SELECT 
    mytable.id, 
    mytable.date, 
    ( 
     SELECT 
      MIN(mytablemin.date) 
     FROM mytable AS mytablemin 
     WHERE mytablemin.date > mytable.date 
    ) AS NextDate 
FROM mytable 

これは私が達成しようとしているものです:

ID  Ser   Reg  curr_Date prev_Date 
1  12345  001  2/2/2011 1/3/2011 
1  12345  002  2/2/2011 1/3/2011 
2  23456  001  2/7/2011 1/5/2011 
2  23456  001  3/5/2011 2/7/2011 

私はいずれかをいただければ幸いですこの作業に役立ちます。

+3

へようこそStackOverflow:あなたが投稿コード、XMLまたはデータサンプles ** **テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックすると、フォーマットや構文のハイライト表示ができます! –

+2

** **データベースシステムとバージョンは何ですか? ** SQL **は多くのデータベースシステムで使用されている言語である構造化問合せ言語です - SQLはデータベース製品ではありません**このようなものはベンダー固有のものです。使用しているデータベースシステム.... –

答えて

0

mytableのmytableminコピーにmytableを追加して相関サブクエリに欠落している状態がありました。また、NextDateを持たないレコードを削除することもできますが、結果セットから削除してグループ(Id、Ser、Reg)のレコードが1つしか存在しない場合に不正な結果が生じることがあります。

select * from 
(
    SELECT 
     mytable.id, 
     mytable.date, 
     ( 
      SELECT 
       MIN(mytablemin.date) 
      FROM mytable AS mytablemin 
      WHERE mytablemin.date > mytable.date 
       and mytablemin.id = mytable.id 
       and mytablemin.Ser = mytable.Ser 
       and mytablemin.Reg = mytable.Reg 
     ) AS NextDate 
    FROM mytable 
) a 
where a.NextDate is not null 

そして、ここに集約して派生テーブルを使用したバージョンです:

SELECT 
    mytable.id, 
    mytable.date, 
    mytablemin.minDate 
FROM mytable 
    inner join 
    (
    SELECT mytablemin.id, 
      mytablemin.Ser, 
      mytablemin.Reg, 
      MIN(mytablemin.date) minDate 
    FROM mytable AS mytablemin 
    group by mytablemin.id, 
      mytablemin.Ser, 
      mytablemin.Reg 
    having MIN(mytablemin.date) is not null 
) AS mytablemin 
    on mytablemin.id = mytable.id 
    and mytablemin.Ser = mytable.Ser 
    and mytablemin.Reg = mytable.Reg 
0

Oracleデータベース(あなたが言及していないとして、私は何を取ることができる)

を使用している場合は、あなたが使用することができますリードとラグ関数/これのコマンド。

関連する問題