Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
274 views
in Technique[技术] by (71.8m points)

sql - How to subtract from previous row result?

I need to subtract first row lot_size + substraction result from currentitems column. If no balance left then it should be 0. bal is how result column should look.

    rowno | location | lot_size | currentitems |  bal   | bal_left  
   -------+----------+----------+--------------+--------+--------
        1 | AB1210   |     1200 |         1000 |   1000 |   200
        2 | AB1220   |     1200 |         1000 |    200 |     0
        3 | AB1230   |     1200 |          500 |      0 |     0

Current approach (using postgresql 9.3.1):

SELECT 
    row_number() over (ORDER BY location) as rowno, 
    location,
    currentitems,
    1200 as lot_size,
    --here should be some case or something
    COALESCE(lag(currentitems) over(ORDER BY location),currentitems) AS bal
FROM foo;
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Not sure if that's what you're asking, but here's how you can get next row:

create table a(
  id bigserial primary key,
  val integer
);

select 
  nth_value(val,(row_nr+1)::integer) over () as next_value, 
  val, from 
      (select row_number() over () as row_nr, val from a) t;

And then you can do your cases and subtractions


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.9k users

...