在sql server上获取最近的过去日期记录

在sql server上获取最近的过去日期记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下表格: id dr cr balance txn_date 1 0.00 0.00 31895532.96 12/20/2013 2 15000.00 0.00 31880532.96 12/20/2013 3 102120.00 0.00 31778412.96 12/20/2013 4 15250.00 0.00 31763162.96 12/20/2013 5 75000

我有以下表格:

id  dr          cr     balance      txn_date
 1   0.00      0.00     31895532.96 12/20/2013
 2  15000.00    0.00    31880532.96 12/20/2013
 3  102120.00   0.00    31778412.96 12/20/2013
 4  15250.00    0.00    31763162.96 12/20/2013
 5  75000.00    0.00    25761370.96 12/22/2013
 6  98600.00    0.00    25662770.96 12/22/2013
 7  71460.00    0.00    25591310.96 12/22/2013
 8  518400.00   0.00    25072910.96 12/22/2013
 9  35000.00    0.00    25037910.96 12/22/2013
输入日期时,我需要找到期初余额。例如,当输入
12/20/2013
时,期初余额为
31895532.96

没有必要每天进行交易。我们在2013年12月21日也没有交易,在这种情况下,我们需要在2013年12月20日的最后一笔交易中取得余额,即
31763162.96
。有什么办法可以实施吗

2013年12月20日,我做了以下工作:

select top 1 balance
from banks
where txn_date = '12/20/2013' order by id
现在,当我谈到2013年12月21日时,该日期没有交易。因此,前一日期的最后一笔交易(不一定是昨天,它可以是任何日期,取决于交易日期)应为余额,即
31763162.96

select top 1 balance
from banks
where txn_date <= '12/21/2013' order by id desc
选择前1名余额
来自银行

其中txn_date您没有提供任何关于为什么
31895532.96
应作为
12/20/2013
输入的输出的信息。在您的示例中,有多条记录具有相同的
txn\u日期
值。
在下面的查询中,我在满足
txn\u date
条件的记录中选择一个任意值

SELECT TOP 1 balance       
FROM banks
WHERE txn_date = @argumentDate
在本例中,
@argumentDate
是用于比较的任何日期(
12/20/2013

编辑
假设您的
txn\u date
列是DateTime列,而不仅仅是可以使用的字符串:

SELECT TOP 1 balance
FROM banks
WHERE DATEDIFF(DAY , txn_date , @argumentDate ) <=0
ORDER BY DATEDIFF(DAY , txn_date , @argumentDate ) DESC
选择前1名余额
来自银行

其中DATEDIFF(DAY,txn_date,@argumentDate)使用CTE可以得到逻辑

with cte (DR,CR,Balance,TxnDate,RowID ) as
(
    select DR,CR,Balance,TxnDate,Row_number() over (PARTITION by txndate order by txndate desc) as RowID 
    from Trans
) 
select top 1 Balance 
from cte 
where TxnDate = case when @TXNDATE = '12/20/2013' then  (select top 1 TxnDate from Cte where @TXNDATE = '12/20/2013') 
                  when @TXNDATE > '12/20/2013' then (select top 1 TxnDate from Cte where TXNDATE='12/20/2013' ) end
ORDER BY 
    case when @TXNDATE = '12/20/2013' then RowID end ASC,
    case when @TXNDATE > '12/20/2013' then RowID end Desc 

为什么你迷路了我不明白你在维护哪一个?你是在说sum(dr)=balance吗?没有“balance”列那么上次更新和当前的关系是什么?如果你只是按照你的帖子存储日期,那么就可能用你迄今为止尝试过的SQL查询来显示你的努力,当某个特定日期重复时,你将无法找到期初余额,你实际上需要在同一个日期列中存储时间,只有这样你才能使用order by子句对结果进行排序请解释为什么你的示例不适用于你。你得到了什么?你希望得到什么?。当有交易发生时,它将返回余额@argumentDate@timus2001我已根据您的编辑编辑了答案