2008-10-02 2 views
1

でこれを行います。は、私はそのように見えるテーブルを持っている単一のSQL

私は他の言葉で、ハイライトされた行に対応するCLNDR_DATEを見つける必要がある:
は、EFFECTIVE_DATEがnullでない列の一番上のグループを検索 、そのグループの最後の行のCLNR_DATEを返します。

通常、私はEFFECTIVE_DATEにNULLが見つかるまで、カーソルを上から下に向かって開きます。それから私は、私が探している日付が前のステップで得られたCLNDR_DATEであることを知っています。

ただし、同じSQLを1つのSQLで実現できるのだろうか?

+0

あなたがあまりにも悪いことしていないよう求めているが、あなたは少しを明確にすることができます - あなたが後にテーブルから最も古いレコードをつかむためにそれを必要と言っていますeffective_dateの最後のnull? – Dr8k

答えて

7

警告:DBAではありません。 ;)

しかし、それを簡単に、テストされていない刺す:

SELECT min(CLNDR_DATE) FROM [TABLE] 
WHERE (EFFECTIVE_DATE IS NOT NULL) 
    AND (CLNDR_DATE > (
    SELECT max(CLNDR_DATE) FROM [TABLE] WHERE EFFECTIVE_DATE IS NULL 
)) 

あなたはなしで最後 EFFECTIVE_DATEと最初 CLNDR_DATE をしたいと仮定。

あなたはない最初のが最初にしたい場合は、分を使用するサブクエリを変更する()の代わりに、MAX()。

0

このレコードセットの最初の結果は、探しているものです。お使いのデータベースに応じて、あなただけのLIMITを使用して、この行を返すことができたり、TOP

SELECT CLNDR_DATE 
FROM TABLE 
WHERE CLNDR_DATE > (SELECT MAX(CLNDR_DATE) 
        FROM TABLE 
        WHERE EFFECTIVE_DATE IS NOT NULL) 
ORDER BY CLNDR_DATE 
0

は、Oracle環境にある場合、あなたは親切行うには非常に強力なツールであり、分析機能(http://www.orafaq.com/node/55)を、使用することができますあなたが求めている質問の

標準のSQLを使用すると、それは不可能だと思うかもしれませんが、多分SQLの専門家が素晴らしい解決策を見せてくれるでしょう。 (未テスト)Oracleの解析関数

select * 
from 
(
    select 
    clndr_date, 
    effective_date, 
    lag(clndr_date, 1, null) over (order by clndr_date desc) prev_clndr_date 
    from table 
) 
where effective_date is null 

lag(clndr_date, 1, null) over (order by clndr_date desc)は前clndr_dateを返し、または、これは最初の行である場合はnull使用を使用

1

(編集:固定順)

+0

over(clndr_date DESCによる注文) ジョブを実行します。 はい、あまりにも遅い:-( –

+0

これは、最新のものだけでなく、OPが望むものであるかどうかにかかわらず、すべてのギャップを表示するという利点があります。 –

関連する問題