このディレクトリの索引
#  出典 :: SQL質疑応答スレ 14問目 #896
#  質問です。
#  PostgreSQL9.3
#  
#  テーブル
#  DATE, VALUE 
#  20140401,-13
#  20140402,-11
#  20140403, 12
#  20140404, 13
#  20140405, 12
#  20140406,-11
#  
#  欲しい結果 
#  DATE, VALUE ,COUNT
#  20140401,-13, 1
#  20140402,-11, 2
#  20140403, 12, 1
#  20140404, 13, 2
#  20140405, 12, 3
#  20140406,-11, 1
#  
#  このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 

テーブル(20140401,-13).
テーブル(20140402,-11).
テーブル(20140403, 12).
テーブル(20140404, 13).
テーブル(20140405, 12).
テーブル(20140406,-11).


'VALUEの値の正負の連続数をCOUNTし出力する' :-
テーブルデータをならびに取得(LL),
'VALUEの値の正負の連続数をCOUNTし出力する'(LL).

テーブルデータをならびに取得(LL) :-
findall([_DATE,_VALUE],テーブル(_DATE,_VALUE),LL).

'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :-
forall(同一の符号の最大連続(LL,LL2),
'COUNTして出力する'(LL2)).

同一の符号の最大連続(LL,LL2) :-
append([LL1,LL2,LL3],LL),
'LL2が同一符号の最大連続である'(LL1,LL2,LL3).

'LL2が同一符号の最大連続である'(LL1,LL2,LL3) :-
全てが同一符号(LL2,_符号),
'LL1の最後の要素の符号は異なる'(LL1,_符号),
'LL3の最初の要素の符号は異なる'(LL3,_符号).

全てが同一符号([],_).
全てが同一符号([[_,_VALUE]|R],_符号) :-
符号(_VALUE,_符号),
全てが同一符号(R,_符号).

符号(_VALUE,+) :-
_VALUE >= 0.
符号(_VALUE,-) :-
_VALUE < 0.

'LL1の最後の要素の符号は異なる'(LL1,_符号) :-
\+((last(LL1,[_,_VALUE]),符号(_VALUE,_符号))).

'LL3の最初の要素の符号は異なる'(LL3,_符号) :-
\+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))).

'COUNTして出力する'(LL2) :-
forall(
nth1(_nth1,LL2,[_DATE,_VALUE]),
writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])).