我有以下格式的数据
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的记录数不固定..
答案 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 )
正如我在评论中提到的,您对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
根据需要调整它。
分享并享受。