需要在oracle sql的LEAD函数中进行一些更正

问题描述 投票:0回答:1

这是我的桌子

 ID NAME     YEAR PRICE
--- ------ ------ -------
  1 A        2015 3
  1 A        2016 4
  1 A        2017 7
  2 B        2015 4
  2 B        2016 2
  2 B        2017 6

需要输出此

  ID NAME     LEAD   YEAR LEAD_SAL  PRICE    PRICE
---- ------ ------ ------ --------- ------- ------
   1 A        2016   2015 4         3            1
   1 A        2017   2016 7         4            3
   1 A               2017           7
   2 B        2016   2015 2         4            -2
   2 B        2017   2016 6         2            4
   2 B               2017           6

我的查询

SELECT id, name, LEAD(year,1,NULL) OVER (PARTITION BY id ORDER BY year) lead, year
               , LEAD(price,1,NULL) OVER (PARTITION BY id ORDER BY price) lead_sal, price
               , LEAD(price,1,NULL) OVER (PARTITION BY id ORDER BY price) - Price Price
   FROM price_tb;

但是答案是这样的

  ID NAME     LEAD   YEAR LEAD_SAL  PRICE    PRICE
---- ------ ------ ------ --------- ------- ------
   1 A        2016   2015 4         3            1
   1 A        2017   2016 7         4            3
   1 A               2017           7
   2 B        2016   2015 6         4            2
   2 B        2017   2016 4         2            2
   2 B               2017           6

这里id 1工作正常,但是id 2给出的输出与预期的有所偏差。我该如何重写此查询?

sql oracle
1个回答
0
投票

怎么样

SQL> with test (id, name, year, price) as
  2    (select 1, 'A', 2015, 3 from dual union all
  3     select 1, 'A', 2016, 4 from dual union all
  4     select 1, 'A', 2017, 7 from dual union all
  5     --
  6     select 2, 'B', 2015, 4 from dual union all
  7     select 2, 'B', 2016, 2 from dual union all
  8     select 2, 'B', 2017, 6 from dual
  9    )
 10  select
 11    id,
 12    name,
 13    lead(year) over (partition by id order by year) lead_year,
 14    year,
 15    lead(price) over (partition by id order by year) lead_price,
 16    price,
 17    --
 18    lead(price) over (partition by id order by year) - price diff
 19  from test
 20  order by id, year;

        ID N  LEAD_YEAR       YEAR LEAD_PRICE      PRICE       DIFF
---------- - ---------- ---------- ---------- ---------- ----------
         1 A       2016       2015          4          3          1
         1 A       2017       2016          7          4          3
         1 A                  2017                     7
         2 B       2016       2015          2          4         -2
         2 B       2017       2016          6          2          4
         2 B                  2017                     6

6 rows selected.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.