【问题标题】:Previous Year record in sql serversql server 上一年的记录
【发布时间】:2020-07-14 23:50:20
【问题描述】:

我们如何在当前行中获取上一年的值。

例子

id      year    amount
1001    2001    2400
1002    2003    3600
1003    2005    2300
1002    2004    1600

期望的输出

id      year    amount  prevyearAmount
1001    2001    2400    Null
1002    2003    3600    2400
1003    2005    2300    1600
1002    2004    1600    3600

【问题讨论】:

    标签: sql sql-server tsql sql-server-2016 window-functions


    【解决方案1】:

    窗口函数lag() 完全符合您的要求:

    select t.*, lag(amount) over(order by year) prev_amount
    from mytable t
    

    【讨论】:

    • 感谢您的及时回复,但延迟功能需要很长时间,因为我需要在超过 100 万条记录上旋转它
    • @sql2020:对于这个任务,lag() 是迄今为止最有效的解决方案。其他选项需要自行加入表,这将更加昂贵。
    【解决方案2】:

    我想你只是想要lag():

    select t.*, lag(amount) over (order by year) as prev_year_amount
    from t;
    

    请注意,您要求的是前一年有数据,而不是前一年。在我看来,您应该有 2003 年的 NULL,因为数据中没有 2002 年。

    如果这是您真正想要的,那么自联接就足够简单了:

    select t.*, tprev.amount as prev_year_amount
    from t left join
         t tprev
         on tprev.year = t.year - 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2021-04-22
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多