任何人都可以帮助增强下面的查询,
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 中增强此代码。提前感谢您的帮助!
答案 0 :(得分:1)
假设两件事:
然后就可以使用窗口函数和过滤了:
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;