如何获取SQL服务器的累计记录?

How to get cumulative record In SQL Server?

我在 SQL 服务器中有一些数据,格式如下。

declare @statement table 
                   (
                       acctno int,
                       statDate date,
                       tod int,
                       lastDate date 
                   )

 insert into @statement select 123,'2018-02-12',567,'2018-01-12'
 insert into @statement select 123,'2018-03-12',580,'2018-02-12'
 insert into @statement select 123,'2018-04-12',567,'2018-03-12'

 --select * from @statement


  declare @txn table 
               (
                   acct int,
                   txndate date,
                   amount int
               )

 insert into @txn select 123,'2018-02-11',400
 insert into @txn select 123,'2018-02-18',400
 insert into @txn select 123,'2018-02-25',400
 insert into @txn select 123,'2018-03-11',400
 insert into @txn select 123,'2018-03-25',400

两个表的结果类似如下。

]1

现在我想要如下所示的结果:

我正在尝试通过此查询获取它:

 ;with cte  as 
 (
     select 
         acctno, statDate, tod, txndate, amount, lastDate  
     from 
         @statement
     inner join 
         @txn on acctno = acct
 )
 select * 
 from @txn t
 left join cte on acct = acctno
               and t.txndate between statDate and lastDate

但是结果没有按预期返回 - 请帮我得到想要的结果。

我认为你可以更简单地做到这一点

select s.acctno,statDate,tod,txndate,amount,lastDate
from @txn t
Inner join @statement s
  On  s.acctno = t.acct
  And t.txndate Between s.lastDate and s.startDate

您可能需要将 BETWEEN 更改为“<”以进行开始日期比较。

这是一个经典的 DKNF 连接:

WITH TD AS(
SELECT T1.acctno, T1.statDate AS StartDate, T1.tod, COALESCE(MAX(T2.statDate), '1-01-01') AS BeforeDate
FROM   @statement AS T1
       LEFT OUTER JOIN @statement AS T2
          ON T1.acctno = T2.acctno AND T1.statDate < T2.statDate
GROUP  BY T1.acctno, T1.statDate, T1.tod
)
SELECT acctno, StartDate, tod, txndate, amount
FROM   TD
       JOIN @txn AS t
          ON TD.acctno = t.acct AND txndate <= StartDate AND txndate > BeforeDate