给定输出所需的查询

时间:2012-10-31 09:28:27

标签: sql oracle

我有以下格式的数据

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的记录数不固定..

2 个答案:

答案 0 :(得分: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 )

这是the SQL Fiddle

正如我在评论中提到的,您对FIELD1的排序顺序很糟糕,因此您需要为window子句提供自己的ORDER BY列。

答案 1 :(得分: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

根据需要调整它。

分享并享受。