calculate the differences between two rows in SQL

前端 未结 3 649
暖寄归人
暖寄归人 2021-01-03 12:21

I have a SQL table, one row is the revenue in the specific day, and I want to add a new column in the table, the value is the incremental (could be positive or negative) rev

相关标签:
3条回答
  • 2021-01-03 12:58

    If you're okay with re-ordering the columns slightly, something like this is pretty simple to understand:

    SET @prev := 0;
    SELECT day, revenue - @prev AS diff, @prev := revenue AS revenue
    FROM revenue ORDER BY day ASC;
    

    The trick is that we calculate the difference to the previous first, then set the previous to the current and display it as the current in one step.

    Note, this depends on the order being correct since the calculations are done during the returning of the rows, so you need to make sure you have an ORDER BY clause that returns the days in the correct order.

    0 讨论(0)
  • 2021-01-03 13:00
    SELECT a.day, a.revenue , a.revenue-COALESCE(b.revenue,0) as previous_day_rev 
    FROM DailyRevenue a 
    LEFT JOIN DailyRevenue b on a.day=b.day-1
    

    the query assume that each day has one record in the table. If there could be more than 1 row for each day you need to create a view that sums up all days grouping by day.

    0 讨论(0)
  • 2021-01-03 13:06

    Try;

    select 
        t.date_col, t.val_col,
        case when t1.val_col is null then 0
        else t.val_col - t1.val_col end diff
    from (
        select t.* , @r := @r + 1 lev
        from tbl t,
        (select @r := 0) r
        order by t.date_col
    ) t
    left join (
        select t.* , @r1 := @r1 + 1 lev
        from tbl t,
        (select @r1 := 1) r
        order by t.date_col 
    ) t1
    on t.lev = t1.lev
    

    This will calculate value diff even if there is a missing date

    0 讨论(0)
提交回复
热议问题