在SQL中混合日期频率

时间:2012-06-04 14:50:40

标签: 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 *息税前利润,但EBIT仅在随机日期每季度更改一次。总而言之,我希望能够在每个季度随机变化时仅使用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

感谢您的帮助!

我遇到的解决方案之一:

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

2 个答案:

答案 0 :(得分:1)

你要找的是两张桌子之间的非等值。如果您在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记录中使用有效日期和结束日期,而不仅仅是日期日期。

答案 1 :(得分: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