在 SAS 过程中重新创建 Tableau 函数 FIXED SQL

Recreate Tableau function FIXED in SAS proc SQL

我正在努力将在 Tableau 中执行的计算转移到在底层 SAS 查询中执行,但我很难重新创建 Tableau 详细级别函数 FIXED。这是一个例子: { FIXED [ID_Field], [Group]: MAX([Value_Field]) } 画面计算是说 为每个组中每个人的 ID_Field 找到 Value_Field 的最大值

我尝试使用子查询来复制它,所以我的查询看起来和操作是这样的

Proc SQL; Create table XYZ.Tableau_Calcs AS

SELECT 
Value Field
,ID_Field
,(Select MAX(Value_Field) 
 From XYX.Original_Calcs 
 group by ID_Field, Group) as SAS_Calc
,Group
,Date
,Flag
From XYX.Original_Calcs

但是,我收到一条错误消息“错误:子查询评估为不止一行。”显然这意味着它产生了不止一条线

有谁知道如何解决这个错误?这是一些与我在工作中处理的数据具有相同结构的数据。

Value_Field ID_Field Group Date Flag
56 25193T4010 H5 10/31/2018 1
56 25193T4010 H5 1/28/2019 1
38 25193T4010 N9 2/9/2019 0
38 73437H0904 E3 7/6/2017 1
38 73437H0904 E3 3/14/2017 1
48 73437H0904 H5 8/14/2018 1
48 73437H0904 H5 10/15/2018 1
66 91641V2912 H5 10/1/2018 0
66 91641V2912 H5 11/1/2019 1
98 91641V2912 N9 3/1/2019 1
98 91641V2912 N9 3/1/2019 1

PROC SQL 将让您计算聚合函数并保留详细的观察结果。它会自动将汇总值重新合并到该组的所有详细观察结果中。

data have;
  input value_field id_field :. group $ date :mmddyy. flag;
  format date yymmdd10.;
cards;
56 25193T4010 H5 10/31/2018 1
56 25193T4010 H5 1/28/2019 1
38 25193T4010 N9 2/9/2019 0
38 73437H0904 E3 7/6/2017 1
38 73437H0904 E3 3/14/2017 1
48 73437H0904 H5 8/14/2018 1
48 73437H0904 H5 10/15/2018 1
66 91641V2912 H5 10/1/2018 0
66 91641V2912 H5 11/1/2019 1
98 91641V2912 N9 3/1/2019 1
98 91641V2912 N9 3/1/2019 1
;

proc sql;
create table want as
  select
      id_field
    , group
    , max(value_field) as sas_calc
    , value_field
    , date
    , flag
  from have
  group by id_field, group
;
quit;

请注意,对于您的示例数据,新的 SAS_CALC 变量在每次观察时都与当前的 VALUE_FIELD 完全相同。

我认为您可以在 SAS(或其他数据库)中按如下方式修改您的查询以使其正常工作,但@Tom 的回答是更适合您的 SAS 答案。

您确实需要添加别名并且您需要为每个 ID 和组 子查询 运行 因此您需要通过 WHERE 子句包含它只有 returns 每行的正确值,而不是整个数据集。添加 WHERE 将结果限制为感兴趣的行。

Proc SQL; 
Create table XYZ.Tableau_Calcs AS
SELECT 
Value_Field
,ID_Field
,(Select MAX(Value_Field) 
 From XYX.Original_Calcs as T1_sub
 where t1_sub.ID_FIELD=t1.ID_FIELD and t1_sub.group=t1.group
 group by ID_Field, Group) as SAS_Calc
,Group
,Date
,Flag
From XYX.Original_Calcs as T1;
quit;

至少有两种其他方法可以在 SAS 中执行此操作 - 如果您需要效率,一种是创建 summary statistics separately and merge them in. And a second is a DoW loop