我有以下格式的数据
g_name amt flag
g1 0 0
g1 0 0
g1 10 1
g1 0 0
g1 15 2
g1 0 0
我需要以下格式
n1
的数据从amt点击1
的行开始,并且一直保留到最后,类似n2
的数据从行开始,其中amt hits {{1}它一直保留到最后,请帮助我完成任何需要连接的窗口功能。请。
2
答案 0 :(得分:1)
我添加了一个用于订购的列 - 根据需要进行更改。我还添加了一些具有不同g_name
的行,可能必须“通过g_name
”完成。
这是first_value()
分析函数的一个很好的测试用例。它能够忽略空值 - 所以我们在amt
不是1(或2等)时使flag
为NULL,然后将first_value()
与适当的PARTITION BY和ORDER BY一起应用条款。
with
test_data ( id, g_name, amt, flag ) as (
select 1, 'g1', 0, 0 from dual union all
select 2, 'g1', 0, 0 from dual union all
select 3, 'g1', 10, 1 from dual union all
select 4, 'g1', 0, 0 from dual union all
select 5, 'g1', 15, 2 from dual union all
select 6, 'g1', 0, 0 from dual union all
select 1, 'g2', 0, 0 from dual union all
select 2, 'g2', 4, 1 from dual union all
select 3, 'g2', 3, 2 from dual union all
select 4, 'g2', 0, 0 from dual
)
-- end of test data; solution (SQL query) begins below this line
select id, g_name, amt, flag,
coalesce (first_value(case when flag = 1 then amt end ignore nulls)
over (partition by g_name order by id), 0) as n1,
coalesce (first_value(case when flag = 2 then amt end ignore nulls)
over (partition by g_name order by id), 0) as n2
from test_data
order by g_name, id
;
ID G_NAME AMT FLAG N1 N2
--- ------ ---------- ---------- ---------- ----------
1 g1 0 0 0 0
2 g1 0 0 0 0
3 g1 10 1 10 0
4 g1 0 0 10 0
5 g1 15 2 10 15
6 g1 0 0 10 15
1 g2 0 0 0 0
2 g2 4 1 4 0
3 g2 3 2 4 3
4 g2 0 0 4 3
答案 1 :(得分:0)
SQL表代表无序集。除非列指定了排序,否则没有排序。我假设这样一个列存在。
如果是这样,您可以使用分析函数执行此操作:
select t.*,
max(case when flag = 1 then amt else 0 end) over (order by ??) as n1,
max(case when flag = 2 then amt else 0 end) over (order by ??) as n2
from t;
??
指定排序。