0

我有两张表 Deal 和 SCHNAV 有一个共同的字段“安全”。交易包含迄今为止购买和出售的所有证券的详细信息,而 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';

请帮忙。并提前致谢

4

1 回答 1

1

您需要将dealsecurity表连接在一起。除了字段条件外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;
于 2013-07-29T12:58:56.677 回答