SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 643|回复: 4
打印 上一主题 下一主题

请教:相同的code, 不同的结果(关于monotonic()函数)

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-7-2 17:33:32 | 只看该作者

请教:相同的code, 不同的结果(关于monotonic()函数)

有如下代码:

data a;
     input x;
         cards;
3
4
5
6
;
run;

proc sql;
     create table b as
          select mean(x) as meanx
          from a
          where monotonic() gt 2;

     create table c as
        select mean(x) as meanx
          from a
          where monotonic() gt 2;
run;


请问为什么数据集b为:
     meanx
         5.5

而数据集c却为:
    meanx
        4.5

请解释一下monotonic()的用法,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-7-2 20:31:27 | 只看该作者

Re: 请教:相同的code, 不同的结果(关于monotonic()函数)

估计是由于关系型数据库里,记录的次序本来就不应当是一个合法的信息,所以很难确定哪一条是实际排在前面或者后面。这就是使用不该使用的信息要花的代价。如果次序是有用的就应该有一个显式的key variable.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-7-3 08:57:11 | 只看该作者

Re: 请教:相同的code, 不同的结果(关于monotonic()函数)

谢谢ahuige!

不过我感觉还不是次序的问题,应该是monotonic()的原因。

data a;
input x;
cards;
3
4
5
6
;
run;

proc sql;
create table b as
select x,monotonic() as n
from a;

create table c as
select x,monotonic() as n
from a;
quit;

table b:
x    n
-------
3    1
4    2
5    3
6    4

table c:

x    n
-------
3    5
4    6
5    7
6    8

所以表b里后面两条记录的monotonic()大于2,所以均值为5.5;
而表c里四条记录的monotonic()都大于2, 所以4.5是所有四个x:3,4,5,6的均值。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-7-3 13:45:24 | 只看该作者

Re: 请教:相同的code, 不同的结果(关于monotonic()函数)

好测试,看来是只用了一个PROC SQL的原因,你用两次PROC SQL分别操作应该就好了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-7-3 14:02:16 | 只看该作者

Re: 请教:相同的code, 不同的结果(关于monotonic()函数)

对,用两个PROC SQL就没有问题了。
只是对monotonic()的处理过程还是不懂。请看下面的code:

data a;
     input x y;
         cards;
3 1
4 2
5 5
6 8
;
run;


proc sql;
     create table b as
            select x, monotonic() as n
                  from a;

     create table c as
            select x,y, monotonic() as n
                  from a;
quit;

=====================================
table b:
x    n
--------
3    1
4    2
5    3
6    4

table c:
x    y    n
-------------
3    1    1
4    2    2
5    5    3
6    8    4
======================================


proc sql;
     create table d as
            select mean(x) as meanx
                  from a
                  where monotonic() gt 2;

     create table e as
            select mean(x)as meanx,mean(y) as meany
                  from a
                  where monotonic() gt 2;
quit;

====================================
table d:

meanx
--------
5.5


table e:

meanx    meany
---------------------
   5.5      6.5
=============================================
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 19:38 , Processed in 0.136640 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表