0

私は次のようなデータを持っています:

        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のおかげで)の後、それは機能しているように見えます。

4

1 に答える 1

2

試す:

SELECT  t3."ID", t3.f "start", t3."TO" "end", t3.types
FROM (
SELECT sys_connect_by_path(t2."TYPE",',') types,
       connect_by_root(t2."FROM") f,
       t2."FROM",
       t2."TO",
       connect_by_isleaf is_leaf ,
t2."ID"
FROM (
  SELECT t.*, lag(t."FROM") over (ORDER BY t."FROM") nfrom
    FROM table1 t
   WHERE t."ID" = 'A'
  ) t2
START WITH t2."START_CODE" = 'S'
CONNECT BY   PRIOR t2."FROM" = t2.nfrom  AND t2."START_CODE" = 'P') t3
WHERE is_leaf=1

ここにフィドルがあります
ここに別のフィドルがあります(コメントと更新を見た後)

于 2012-10-16T12:30:35.397 に答える