如何在SQLServerSelect语句中获取上一个值

如何在SQLServerSelect语句中获取上一个值,sql,sql-server,Sql,Sql Server,我有一张这样的桌子 我想添加一个名为“昨天金额”的列,其中的值是前一日期的金额和相同的账号。例如,在账号=1中,日期为2014年3月24日,昨天金额列的值为100。这个问题有什么解决办法吗 这是你的问题。如果不是昨天的日期,金额将为0,因此这将仅显示基于每个账号的昨天日期的金额 更新 正如@BenThul指出的,LAG有一个可选的默认值,可以用来消除使用COALESCE的需要: 原始答案 当前一天不存在值时,可以使用LAG和COALESCE将空值转换为0: SELECT ACCOUNT_NO,

我有一张这样的桌子


我想添加一个名为“昨天金额”的列,其中的值是前一日期的金额和相同的账号。例如,在账号=1中,日期为2014年3月24日,昨天金额列的值为100。这个问题有什么解决办法吗

这是你的问题。如果不是昨天的日期,金额将为0,因此这将仅显示基于每个账号的昨天日期的金额

更新

正如@BenThul指出的,LAG有一个可选的默认值,可以用来消除使用COALESCE的需要:

原始答案

当前一天不存在值时,可以使用LAG和COALESCE将空值转换为0:

SELECT ACCOUNT_NO,
       [Date],
       Amount,
       COALESCE(LAG(Amount) OVER(PARTITION BY ACCOUNT_NO ORDER BY [Date]), 0) AS "Yesterday Amount"
FROM test
输出:

ACCOUNT_NO  Date                    Amount  Yesterday Amount
1           23/03/2014 00:00:00     100     0
1           24/03/2014 00:00:00     200     100
1           25/03/2014 00:00:00     50      200
2           23/03/2014 00:00:00     1111    0
3           24/03/2014 00:00:00     1200    0
3           25/03/2014 00:00:00     1300    1200
未经测试


在帐户号相等且日期少一的条件下将表连接到自身。当没有以前的值时,使用left outer join将保留空值。如果您想将金额改为零,请将其替换为isNullDate\u Amount,0。

最好使用dateadd而不是date+1感谢您的建议@avery\u larry,我已更新为使用dateaddinstead@KemikoSetiawan . . . 我认为这是更好的答案。您专门询问昨天,而不是数据中的前一行。因此,即使在缺少日期的情况下也可以这样做。我认为,LAG不是使用COALESCE调用,而是使用一个可选的默认参数,该参数表示当偏移量超出分区的范围时要返回什么值@BenThul谢谢-我完全忘记了那个参数。我已经更新了答案。很整洁!:
SELECT ACCOUNT_NO,
       [Date],
       Amount,
       COALESCE(LAG(Amount) OVER(PARTITION BY ACCOUNT_NO ORDER BY [Date]), 0) AS "Yesterday Amount"
FROM test
ACCOUNT_NO  Date                    Amount  Yesterday Amount
1           23/03/2014 00:00:00     100     0
1           24/03/2014 00:00:00     200     100
1           25/03/2014 00:00:00     50      200
2           23/03/2014 00:00:00     1111    0
3           24/03/2014 00:00:00     1200    0
3           25/03/2014 00:00:00     1300    1200
select Table.ACCOUNT_NO, Table.Date, Table.Amount,
    Table2.Amount Yesterday_Amount
from Table
left outer join Table as Table2
   on Table.ACCOUNT_NO = Table2.ACCOUNT_NO
   and Table.Date = dateadd("dd",1,Table2.Date)