私は次のようなデータを持っています:
ID FROM TO START_CODE END_CODE TYPE
A 01/01/2012 02/02/2012 P E 1
A 12/03/2011 01/01/2012 P X 1
A 01/01/2011 12/03/2011 S X 2
A 01/01/2010 02/02/2010 P E 2
A 12/03/2010 01/01/2010 P X 4
A 01/01/2009 12/03/2009 S X 1
基本的に、これは1人のクライアントに関する情報です。end_code'e'はケア期間の終了を示し、start_code's'はケア期間の開始を示します。'p'の開始コードは、'x'の終了コードと同様に、日付が継続であることを示します。返せるようにしたいのは、次のようなデータです。
ID START END Types
A 01/01/2011 02/02/2012 2,1,1
A 01/01/2009 02/02/2010 1,4,2
最初のテーブルのクエリはこれに似ていますが(例のみ)、「A」だけでなく、多数のクライアントを返すことに関心があります。
SELECT
A.ID,
A.FROM,
A.TO,
A.START_CODE,
A.END_CODE,
A.Type
WHERE
A.ID = 'A'
私は過去にxmlaggを使用して同様のことを実現しました(つまり、1つのセルに情報をリストするため)が、実際には各クライアントの個別の開始日と終了日を識別し、苦労しているタイプのシーケンスを返します。参考までに、私のオラクルのバージョンは10g、10.2.0.5.0です。
お時間をいただきありがとうございます。ポインタや支援をいただければ幸いです。
以下のABCadeによる提案を含むように編集されました:
SELECT
t3.MOV_PER_GRO_ID,
t3.f,
t3.MOV_END_DATE,
t3.types,
LENGTH(REGEXP_REPLACE(t3.types,'[^,]')) as "Count"
FROM(
SELECT
sys_connect_by_path(t2.MOV_2000_PLACEMENT_TYPE,',') types,
connect_by_root(t2.MOV_START_DATE) f,
t2.MOV_START_DATE,
t2.MOV_END_DATE,
connect_by_isleaf is_leaf,
t2.MOV_PER_GRO_ID
FROM (SELECT t.*,
lag(t.MOV_START_DATE) over (ORDER BY t.MOV_PER_GRO_ID, t.MOV_START_DATE) nfrom
FROM O_MOVEMENTS t
WHERE t.MOV_PER_GRO_ID IN ('A','B'))t2
START
WITH
t2.MOV_2000_START_REASON = 'S'
CONNECT BY
PRIOR t2.MOV_START_DATE = t2.nfrom
AND PRIOR t2.MOV_PER_GRO_ID = t2.MOV_PER_GRO_ID
AND t2.MOV_2000_START_REASON IN ('P'))t3
where t3.is_leaf=1
ABCadeのソリューションに基づいて更新されました。いくつかの調整(ABCadeのおかげで)の後、それは機能しているように見えます。