0

共通のフィールド「セキュリティ」を持つ2つのテーブルDealとSCHNAVがあります。Deal には、日付までに購入および売却されたすべての証券の詳細が含まれ、schnav には、各日付のクロージング証券保有が含まれます。特定の日付に保持されている証券で行われたすべての取引の最新 (最大) 日付を、その日付までの取引テーブルからフェッチする SQL が必要です。

次のクエリを使用してすべての取引を取得し、ピボットから最新の値を取得しました。しかし、Excelで操作を行う必要がないように、SQLが必要です。

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;

編集:

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 に答える