查找日期死后的第一笔交易

时间:2021-02-15 12:15:08

标签: sql sql-server

任何人都可以帮助增强下面的查询,

select 
columns
from 
(
select t.*,
sum (case when TRAN_DATE >= '20170701' then 1 end)
over (partition by acct_no order by TRAN_DATE, TRAN_TIME ) as sm_i
from (
Select 
Columns
FROM 
#BASEtable DTRAN
INNER JOIN sometable 
where condition) t) t
where sm_i = 1 
order by acc_no

这里是数据示例,(附)

Company Acct_no Tran_Date   Death_of_date
1   123 20170725    20170702
1   123 20170825    20170702
1   123 20170925    20170702
2   456 20191025    20200101
2   456 20191125    20200101
2   456 20191225    20200101

预期结果:第 1 行,因为这是该帐户在 death_of_date 之后的第一笔交易

我正在根据 20170701 对数据进行排序,也就是说,它将选择该日期之后发生的第一笔交易,该交易应与上述查询一起使用。

现在,我想用动态值设置“20170701”的值,即需要每个帐户在其死亡日期后的第一笔交易..

我将分区代码替换为以下代码,

sum(case when tran_Date > = (select death_of_date from #basetable a where a.acct_no = t.acct_no ) then 1 end)
over partition by acct_no order by tran_Date , tran_Time) as sm_i 

但收到错误提示,子查询返回了多个结果,这不是使用 > 、= 等的应用程序。

请帮助在 sql server 中增强此代码。提前感谢您的帮助!

enter image description here

1 个答案:

答案 0 :(得分:1)

假设两件事:

  1. 您的数据包含您指定的四列。
  2. 对于每个帐户,您希望第一行满足您的日期条件。

然后就可以使用窗口函数和过滤了:

select t.*
from (select t.*,
             row_number() over (partition by Company, Acct_no order by Tran_Date) as seqnum
      from t
      where tran_date > death_of_date
     ) t
where seqnum = 1;
相关问题