oracle coding sql

时间:2017-01-11 15:09:01

标签: sql oracle

我有以下格式的数据

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

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;

??指定排序。