2017-03-17 16 views
0

私はクエリ結果/テーブルに列id、dateを持っています。同様に:firebird 2.5今日に最も近い日付のレコードを選択


0002ヌルID、日付
0001、2012年1月20日
0001、2014年10月12日
0001、
0001ヌル、2017年5月21日
0001、2017年8月15日
0002、 、2013年6月5日
0002、2017年8月11日
0003、
0004ヌル、2011年12月25日
0005、2017年12月10日
0006、null
0006、2013.04.23



など
実際の例では、数千のIDと150万件以上のレコードがあります。現在の未来日付(idの0001、0002、0005)に最も近いレコードを見つけ出す方法と、null(id 0003)、過去の日付(id 0004)またはnullと過去の日付(id 0006)のテキストのみをテキストで置き換える方法。

ID、日付
0001、2017年5月21日
0002、2017年8月11日
0003、 '置き換えテキスト'
0004、 '置き換えテキスト'
0005、2017年12月10日:結果は次のようになります。
0006、 '置き換えられたテキスト'


など...
この例では、私が必要とするものが正確に表示されることを願っています。
ありがとうございました。

+1

はSO me'サービスのための「コードではありません。あなたは何を試していますか、どこにいらっしゃいますか? –

答えて

1

テーブルにプライマリキーがないようです。 "DATE"のようにフィールド名をタイプ名として使用しないでください。

とにかく、あなたが望むようにする方法の例がありますが、それが最良であるという主張はありません。

多くのレコードがある場合、この手順は遅くなるため、正しいインデックスが配置されていることを確認してください。

SET TERM^; 

create or alter procedure TEMP_TEST_PROC (
    IDATE date) 
returns (
    OID varchar(4), 
    DATE_BEFORE date, 
    DATE_AFTER date, 
    CLOSEST_DATE date, 
    OTEXT varchar(32)) 
as 
begin 
    for select distinct id from test_table_wo_pk 
    into :oid 
    do 
    begin 
    date_before = null; 
    date_after = null; 
    /* get closest past date*/ 
    select first 1 t."DATE" from test_table_wo_pk t 
    where ((t."DATE" <= :idate) and (t.id = :oid)) 
    order by t."DATE" desc 
    into 
     :date_before; 

    /* get closest future date*/ 
    select first 1 t."DATE" from test_table_wo_pk t 
    where (t."DATE" >= :idate) and (t.id = :oid) 
    order by t."DATE" 
    into 
     :date_after; 

    /* bonus - get closest future or past date */ 

    ... You may check date_before, date_after for NULL here, and set closest_date value here.... 

    if ((datediff(day,:date_before,:idate)) < (datediff(day,:idate,date_after))) then 
     closest_date = :date_before; 
    else 
     closest_date = :date_after; 

    /* set text column */ 
    if (:date_after is not null) then 
     otext = :date_after; 
    else 
     otext = 'replased text'; 
    suspend; 
    end 
end^ 

SET TERM ;^

結果:

enter image description here

+0

それは動作します。それは非常に遅いですが、私は移動するための出発点があります....ありがとうございました。 – jirzinek

関連する問題