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

时间:2013-12-31 06:46:13

标签: 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.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

没有必要每天进行交易。我们在21st December 2013也没有交易,在这种情况下,我们需要平衡12/20/2013的最后一笔交易,即31763162.96。有什么想法如何实现呢?

我为12/20/2013执行了以下操作:

select top 1 balance
from banks
where txn_date = '12/20/2013' order by id

现在当我来12/21/2013时,那天没有交易。因此,上一个日期的最后一笔交易(不一定是昨天可能是任何日期,取决于交易日期)应该是平衡,即31763162.96

select top 1 balance
from banks
where txn_date <= '12/21/2013' order by id desc

它返回了上一个日期12.21.2013

的最后一笔交易

如何合并上述两个查询以满足这两个条件?

2 个答案:

答案 0 :(得分:0)

您没有提供有关31895532.96输入12/20/2013的原因的任何信息。在您的示例中,您有多个具有相同txn_date值的记录 在以下查询中,我在满足txn_date条件的记录中选择任意值。

SELECT TOP 1 balance       
FROM banks
WHERE txn_date = @argumentDate

在此示例中,@argumentDate是任何比较日期(问题中为12/20/2013)。

修改
假设您的txn_date列是DateTime列,而不仅仅是您可以使用的字符串:

SELECT TOP 1 balance
FROM banks
WHERE DATEDIFF(DAY , txn_date , @argumentDate ) <=0
ORDER BY DATEDIFF(DAY , txn_date , @argumentDate ) DESC

答案 1 :(得分:0)

使用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