【问题标题】:Statistical MODE function in Teradata SQL or SAS SQLTeradata SQL 或 SAS SQL 中的统计模式函数
【发布时间】:2015-07-25 12:08:06
【问题描述】:

有谁知道 Teradata SQL 或 SAS SQL 中是否有统计模式函数(最常见的观察)?或创建下表的任何替代方法:

我想创建一个包含组变量、不同计数、均值和众数的表,如下所示:

Select a, Count(Distinct(b)), Avg(c), *Mode*(c)
From table
Group By a;

谢谢!

【问题讨论】:

  • 如果一个数据集有多种模式,你有什么特别的偏好吗?
  • 我只是尝试使用 proc fcmp 编写自定义 mode() 函数。由于这里列出的原因太长,我很确定这是不可能的,除非您在运行 SQL 语句之前将某些标志插入数据集中。

标签: sql sas teradata mode


【解决方案1】:

SAS 中没有 MODE 计算功能。您需要使用 PROC MEANS 或 Summary 或 UNIVARIATE 来计算 MODE,或者您可以编写一个 datastep 来获取它。 CLASS 语句可以按变量分组。

proc means data=sashelp.class MODE;
class sex;
run;

同样,对于 teradata,也没有计算 MODE 的函数。您需要编写 SQL 代码来获取 MODE。前段时间我从 Dieter 那里学到了这一点

SELECT column
FROM table
GROUP BY column
QUALIFY RANK() OVER (ORDER BY COUNT(*) DESC) = 1

【讨论】:

  • 不,上面提到的 SQL 是用于 Teradata 而不是 SAS。
  • 嗨,sushil,你能不能稍微扩展一下这个查询,以便它找到每个组“a”的模式,就像我原来的查询一样。这个 QUALIFY RANK() 对我来说很新鲜。谢谢!
【解决方案2】:

您可以在 SAS SQL 中这样做。只需获取要计算模式的变量的计数:

proc sql noprint ;
  create table tmp as
  select age, count(*) as freq
  from sashelp.class
  group by age
  order by freq desc
  ;
quit;

上面的语句将返回所有唯一值的计数,但我们只想要最常见的。因为我们是按降序对输出进行排序,所以我们可以像这样将outobs=1 添加到proc sql 语句中,只返回第一个结果:

proc sql noprint outobs=1;

如果要将值保存到宏变量中,而不是创建表,它将变为:

proc sql noprint outobs=1;      
  select age, count(*) into :mode, :count
  from sashelp.class
  group by age
  order by 2 desc
  ;
quit;

%put &mode;

【讨论】:

  • 我想从技术上讲这与拥有mode() 函数不同。
  • 我还推荐@sushil 回应的proc means 方法。我的回答更多是为了使用 SQL 方法。
【解决方案3】:

感谢您的所有意见。在我看来,没有一种更简洁的方法可以在单个 proc 或 sql 中找到所有这些统计信息。我发现的一件事是使用 PROC REPORT:

Proc Report Data=SASHelp.Class NoWd;
Column Sex N Age=Mean_Age Age=Mode_Age;
Define Sex / Group;
Define Mean_Age / Analysis Mean;
Define Mode_Age / Analysis Mode;
Run;

唯一的问题是无法找到唯一/不同的计数。

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2021-12-30
    • 1970-01-01
    • 2016-12-21
    • 2017-03-09
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多