-4

以下の形式のデータがあるとします

FIELD1   F2       F3 
LIN0_TMP    A0  1
LIN0_TMP    B0  2
LIN0_TMP    C0  3
LIN_TMP     A   1
LIN_TMP     B   2
LIN_TMP     C   3
LIN_TMP     D   4
LIN2_TMP    A2  1
LIN2_TMP    B2  2
LIN2_TMP    C2  3
LIN2_TMP    D2  4

ioraclesqlクエリを使用して以下の形式で出力したい。

FIELD1   F2       F3   FLOW
    LIN0_TMP    A0  1 FLOW1
    LIN0_TMP    B0  2 FLOW1
    LIN0_TMP    C0  3 FLOW1
    LIN_TMP     A   1 FLOW2
    LIN_TMP     B   2 FLOW2
    LIN_TMP     C   3 FLOW2
    LIN_TMP     D   4 FLOW2
    LIN2_TMP    A2  1 FLOW3 
    LIN2_TMP    B2  2 FLOW3
    LIN2_TMP    C2  3 FLOW3
    LIN2_TMP    D2  4 FLOW3

field1のレコード数は、LIN_TMP値ごとに固定されていません。

4

2 に答える 2

3

このソリューションは、分析合計を使用して、F3=1回の現在の合計を生成します。

select field1
      , f2
      , f3
      , 'FLOW'||trim(to_char(rnk))
from 
     (select field1
      , f2
      , f3
      , sum(case when f3 = 1 then 1 else 0 end)
     over (order by field1, f3 range between unbounded preceding and current row) rnk
    from your_table )

これがSQLフィドルです。

コメントで述べたように、FIELD1の並べ替え順序は奇抜なので、window句に独自のORDERBY列を指定する必要があります。

于 2012-10-31T10:01:33.987 に答える
0

また、FIELD1 から個別の値を見つけ、個別の FIELD1 値の ROWNUM に基づいて「フロー」に番号を割り当て、すべてを連結して戻す別の方法を次に示します。

SELECT t.FIELD1, t.F2, t.F3, 'FLOW' || FLOW_NUM AS FLOW
  FROM YOUR_TABLE t
  INNER JOIN (SELECT FIELD1, ROWNUM AS FLOW_NUM
                FROM (SELECT DISTINCT FIELD1
                        FROM YOUR_TABLE 
                        ORDER BY FIELD1 DESC)) t2
    ON (t2.FIELD1 = t.FIELD1)
  ORDER BY FLOW, F2, F3

必要に応じてこれを微調整します。

共有してお楽しみください。

于 2012-10-31T11:04:31.943 に答える