在 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。
我正在努力将在 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。