Proc SQL,SAS截断变量值

时间:2013-11-01 05:57:49

标签: sas proc-sql

我的SAS数据集中有一个具有20位ID的列。当我尝试在SAS EG中使用PROC SQL过滤掉一些记录时,带有ID的字段会截断为1E18,导出会在每个字段中给出截断值,而不是实际值。

我尝试创建数据集并定义字段值,但这没有任何影响。

这是我的示例代码

proc sql; create table a01 as select a.id, a.value from b; quit;

data a02;
set a01;
id = put(id,$30.);
run;

似乎还没有工作。

有没有人知道我做错了什么。

2 个答案:

答案 0 :(得分:3)

[假设您在Windows上使用SAS - 故事在* nix OS上不会太差异] 在SAS下可以准确表示的最大整数是9,007,199,254,740,992或2 ^ 53或大约16位数 - 在大多数情况下,通常15-16位长的信用卡号可以作为数字变量存储在SAS中。但是,正如你所提到的那样,你有一个20位整数,它会导致值失去一些精度并转换成科学记数法。

问题不在于PROC SQL - 问题是SAS在表示大整数方面的限制较小。大多数其他数据库将准确地表示最多2 ^ 64. See SAS documentation

答案 1 :(得分:1)

虽然Sashikanth是正确的,SAS(等)不能安全存储大约15位数字(大多数16位数字,但不是全部),这不是这里的全部问题。 (SAS没有'整数'的真实概念,所有数字都是浮点数,因此最多只存储2 ** 53。)

data a02;
set a01;
id = put(id,$30.);
run;

这错误地使用了30美元。格式,这是一种字符格式。在put中,格式类型由要放置的第一个参数驱动,不是生成的类型(始终字符 - put生成字符,input生成数字)。因此$30.仅在id是字符变量时才适用。由于它似乎是一个数字变量,它需要是:

id2 = put(id,30.);

请注意,左侧是id2 - 您无法在同一数据步骤中将数字id转换为字符id,它们必须具有不同的名称。

您的号码也可能事先转换为1E18(例如Excel,如果它通过那里 - Excel也无法准确存储该号码);如果id是数字变量,那么您发布的数据步骤应该会向数字转换发出一些关于字符的警告。