奇怪的行为做连接和

时间:2014-07-06 19:07:03

标签: sql sas

    create table umd2
    as select a.permno, a.date, a.realdate, exp(sum(log(1+b.ret))) - 1 as cum_return
    from msex2 (obs=50 keep=permno date realdate) as a, msex2 (obs=50 keep=permno date ret) as b
    where a.permno=b.permno and 0<=intck('month', b.date, a.date)<3
    group by a.permno, a.date
    having count(b.ret)=3;

此查询用于计算动量(过去3个月的累计回报)。但是,这给了我重复的行。我认为group by不会返回重复的行? 当我将realdate列添加到我的group by语句时,

    create table umd2
    as select a.permno, a.date, a.realdate, exp(sum(log(1+b.ret))) - 1 as cum_return
    from msex2 (obs=50 keep=permno date realdate) as a, msex2 (obs=50 keep=permno date ret) as b
    where a.permno=b.permno and 0<=intck('month', b.date, a.date)<3
    group by a.permno, a.date, a.realdate
    having count(b.ret)=3;

那些重复的行消失了。这是为什么?

1 个答案:

答案 0 :(得分:5)

这是SAS的行为方式。 SAS识别以下查询:

select a.permno, a.date, a.realdate, count(*)
from <whatever>
group by a.permno, a.date, a.realdate;

作为聚合查询。这意味着行被聚合和减少,每三个列的组合有一个结果行。特别是selectgroup by的非聚合列与select a.permno, a.date, a.realdate, count(*) from <whatever> group by a.permno, a.date; 中的列匹配(或是子集)。

执行此操作时:

a.read_date

您现在使用的是非标准SQL。大多数数据库都会生成错误。 MySQL将接受此语法,并从匹配值为{{1}}分配任意值。 SAS做了不同的事情。 SAS说:“好吧,你显然不打算将其作为聚合查询。”因此,它不会聚合,但会将聚合值附加到每一行。在其他数据库中,您可以使用窗口函数来执行此操作。

从技术上讲,SAS会调用此重新汇总的摘要数据,该数据记录为here