我有两个表Deal和SCHNAV,带有一个公共字段'security'。交易包含迄今为止购买和出售的所有证券的详细信息,并且schnav包含每个日期的关闭证券持有。我想要一个sql来获取在特定日期持有的证券中完成的所有交易的最新(最大)日期,直到交易表的那个日期。
我使用以下查询来获取所有交易,然后从pivot获得最新值。但我需要一个SQL,所以我不必在Excel中进行操作。
select scheme, security, asset_type, tran_type
from deal
where security in (select security from schnav where nav_date = '31 Mar 2013')
and d.value_date < '01 Apr 2013';
请帮忙。并提前致谢
答案 0 :(得分:1)
您需要将deal
和security
表连接在一起。除了security
字段上的条件之外,您还有日期条件。
最后,您需要在日期或之前找到最后一笔交易。为此,大多数数据库都支持row_number()
函数。
以下查询将这些组合在一起:
select scheme, security, asset_type, tran_type
from (select d.scheme, d.security, d.asset_type, d.tran_type,
row_number() over (partition by d.security order by d.value_date desc) as seqnum
from deal d join
schnav s
on d.security = s.security and
d.value_date <= s.nav_date and
s.nav_date = '31 Mar 2013'
) d
where seqnum = 1;
编辑:
要只获得一个tran_type
,请在子查询中使用where
子句:
select scheme, security, asset_type, tran_type
from (select d.scheme, d.security, d.asset_type, d.tran_type,
row_number() over (partition by d.security order by d.value_date desc) as seqnum
from deal d join
schnav s
on d.security = s.security and
d.value_date <= s.nav_date and
s.nav_date = '31 Mar 2013'
where d.tran_type = 'P'
) d
where seqnum = 1;