このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/db/1274791771/139
#  期間の抽出について相談です。 
#  元情報 
#  ID    START    END 
#  -----   -----    ----- 
#  10    2010/06/01  2010/06/12 
#  10    2010/06/13  2010/06/14 
#  10    2010/06/15  NULL 
#  20    2010/06/01  2010/06/11 
#  20    2010/06/13  2010/06/15 
#  ↓ 
#  欲しい情報 
#  ID    START    END 
#  -----   -----    ----- 
#  10    2010/06/01  NULL 
#  20    2010/06/01  2010/06/11 
#  20    2010/06/13  2010/06/15 
#   
#  ・開始日、終了日の期間重複はなし 
#  ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日 
#  ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20) 
#   
#  アドバイス願います。 
# 
# 

'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :-
        findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1),
        findall([_ID,_最小開始日,_最大終了日],(
                    member(_ID,L1),
                    findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日),
                    findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)),
                L).
        write('ID        START        END \n-----     -----        ----- \n'),
        append(_,[[_ID,_Start,_End]|R],L),
        write_formatted('%t        %t   %t\n',[_ID,_Start,_End]),
        R = [].
        
開始日(_ID,_開始日) :- 期間(_ID,_開始日,_).

終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL').