如何在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)