-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

我想使用 oracle sql 查询以以下格式输出。

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

对于每个 LIN_TMP 值,field1 的记录数不是固定的。

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 子句提供自己的 ORDER BY 列。

于 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 回答