2

以下のクエリがあります。

select s1.DATADATE, s1.PRCCD, c.EBIT
from sec_dprc s1 
left outer join rdq_temp c 
on s1.GVKEY = c.GVKEY
and s1.DATADATE = c.rdq
where s1.GVKEY = 008068
order by s1.DATADATE

2 つの列の間で、PRCCD 列が毎日の価格であり、EBIT 列が四半期ごとの値であるローリング計算を作成しようとしています。2 つの積、つまり毎日の PRCCD*EBIT を計算できるようにしたいのですが、EBIT はランダムな日付で四半期に 1 回しか変化しません。要約すると、四半期ごとにランダムに変化する EBIT の新しい値のみを使用して、EBIT と PRCCD の積を計算できるようにしたいと考えています。

DATADATE                PRCCD   EBIT
1984-02-01 00:00:00.000 28.625  NULL
1984-02-02 00:00:00.000 27.875  NULL
1984-02-03 00:00:00.000 26.75   420.155
1984-02-06 00:00:00.000 27      NULL
1984-02-07 00:00:00.000 26.875  NULL

. . .

DATADATE                PRCCD   EBIT
1984-05-02 00:00:00.000 30.75   NULL
1984-05-03 00:00:00.000 30.875  NULL
1984-05-04 00:00:00.000 30.75   NULL
1984-05-07 00:00:00.000 31.125  499.228
1984-05-08 00:00:00.000 31.75   NULL

. . .

1984-07-31 00:00:00.000 25.625  NULL
1984-08-01 00:00:00.000 26.75   NULL
1984-08-02 00:00:00.000 26.375  348.364
1984-08-03 00:00:00.000 26.75   NULL
1984-08-06 00:00:00.000 27      NULL

助けてくれてありがとう!

私がたどり着いた解決策の1つ:

select TD.Date, TD.C CD, TQ.C CQ, TQ.C1, TQ.C/TQ.C1 EBITps,TQ.C/TQ.C1/TD.C PE
from 
(select DataDate date, PRCCD C from sec_dprc where GVKEY = 008068) TD
cross apply (select top 1 rdq date, ebit C, csh12q C1 from rdq_temp  where rdq<=TD.Date order by rdq desc) TQ
order by TD.Date
4

2 に答える 2

1

探しているのは、2 つのテーブル間の非等結合です。rdq_temp データに発効日と終了日があれば、これははるかに簡単になります。それらを SQL Server に追加するために、自己結合と集計を行うことができます (他のデータベースは、lag() および lead() 機能をサポートしています)。

次のクエリは、結合の条件が本質的に「間」である場合にこれを行います。

with rdq as (
    select r.datadate, r.ebit, min(rnext.datadate) as nextdatadate
    from rdq_temp r left outer join
         rdq_temp rnext
         on r.datadate < rnext.datedate
    group by r.datadate, r.ebit
)
select  datadate, prccid, rdq.ebit
from sec_dprc sd left outer join
     rdq
     on sd.datadate >= rdq.datadate and rdq.datadate < rdq.nextdatadate

四半期ごとのデータはそれほど大きくないと推測しているので、これでうまくいくはずです。より多くのデータがある場合は、rdq レコードに asof 日付だけでなく、発効日と終了日を含めることを強くお勧めします。

于 2012-06-04T15:46:19.343 に答える
0

私はこれの性能をチェックしていませんが、それはあなたが望む結果を与えると思います。

select  datadate
        ,prccid
        ,ebit
        ,(  select  top 1 ebit 
            from    sec_dprc s2 
            where   s2.datadate <= s1.datadate 
                and ebit is not null 
            order by datadate desc
        ) as latestEbit
from    sec_dprc s1
于 2012-06-04T15:24:57.790 に答える