SQL中的混合日期频率

SQL中的混合日期频率,sql,sql-server,sql-server-2008,tsql,sql-server-2005,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,我有以下疑问: 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 我试图在两列之间创建一个滚动计算,PRCCD列为每日价格,EBIT列为季度值。我希望能够计算两者的乘积,即PRCCD*每天的息税前利润

我有以下疑问:

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
我试图在两列之间创建一个滚动计算,PRCCD列为每日价格,EBIT列为季度值。我希望能够计算两者的乘积,即PRCCD*每天的息税前利润,但息税前利润仅在随机日期每季度变化一次。总之,我希望能够在息税前利润和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
。 .

。 .

谢谢你的帮助

我想到的解决方案之一是:

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

我还没有检查这个的性能,但我认为它给出了你想要的结果

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

您要寻找的是两个表之间的非等联接。如果在rdq_临时数据上有有效日期和结束日期,这会容易得多。为了将它们添加到SQL Server中,您可以进行自连接和聚合,其他数据库支持滞后和超前功能

以下查询在连接上的条件本质上是介于之间的情况下执行此操作:

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日期。

随着sec_dprc规模的增加,这将使性能呈指数级下降。
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
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