sql - 我如何从最小和最大组中获取日期?
问题描述
我是一名 SAS 开发人员。我有一个 sql 用于从名为“CalculatedPower”的列中获取最小值和最大值。下面是我从 group by 语句中得到的结构(lt_dt 和 lp_dt 是我想要的。我把它放在这里,但它不在我的实际表中,因为我不知道如何实现这一点):
station datetime calculatedpower min_power max_power lt_dt lp_dt
ABBA 28AUG2018:0:0:0 100 1 100 01SEP2018:1:0:0 28AUG2018:0:0:0
ABBA 31AUG2018:12:0:0 88 1 100 01SEP2018:1:0:0 28AUG2018:0:0:0
ABBA 01SEP2018:1:0:0 1 1 100 01SEP2018:1:0:0 28AUG2018:0:0:0
ZZZZ 07SEP2018:0:0:0 900 900 3000 07SEP2018:0:0:0 21SEP2018:0:0:0
ZZZZ 09SEP2018:0:0:0 1000 900 3000 07SEP2018:0:0:0 21SEP2018:0:0:0
ZZZZ 21SEP2018:0:0:0 3000 900 3000 07SEP2018:0:0:0 21SEP2018:0:0:0
如您所见,我将它们按 Station 聚合并使用 Min 和 Max 函数来获取 min_power 和 max_power。现在,我还需要获取最小日期时间(进入 lt_dt)和最大日期时间(进入 lp_dt)。我会期待如下: ABBA lt_dt 是 01SEP2018:1:0:0 而 lp_dt 是 28AUG2018:0:0:0
意思是说,lp_dt(datetime based on max_power) 而 lt_dt(datetime based on min power)
我的分组声明如下:
proc sql;
select
station
,datetime
,calculatedpower
,min(calculatedpower) as lt_calculatedpower
,max(calculatedpower) as lp_calculatedpower
from sumall
group by
station
;
quit;
有没有办法调整我现有的 SQL 语句以实现我想要的日期时间?我尝试了如下所示的附加 SQL 语句(但处理 600k 数据需要很长时间,不确定它是否有效,因为它仍在运行)
proc sql;
select *,
case when calculatedpower=lt_calculatedpower then datetime end as lt_datetime
from minmax;
quit;
使用此代码,我预计如果有几行具有相同的计算功率但与 1 个站点相关的日期时间不同,则会出现问题。
解决方案
这是 SAS PROC Summary 和 DATA STEP 合并以获得最终所需的输出。
使用 OUTPUT 语句中的 MAXID、MINID 选项来获取最大值的 ID 和最小值的 ID。
解决方案的第一部分会生成您的虚假数据 - 请在将来提供该格式的数据。然后 PROC Summary 计算统计数据,您可以将其合并。这应该在您的系统上非常快地完成,不到一分钟。
data have;
input station $ datetime anydtdtm. calculatedpower ;
format datetime datetime.;
cards;
ABBA 28AUG2018:0:0:0 100
ABBA 31AUG2018:12:0:0 88
ABBA 01SEP2018:1:0:0 1
ZZZZ 07SEP2018:0:0:0 900
ZZZZ 09SEP2018:0:0:0 1000
ZZZZ 21SEP2018:0:0:0 3000
;;;;
run;
proc summary data=have nway;
class station;
id datetime;
var calculatedPower;
output out=summary min=Min_power max=max_power minid=min_date maxid=max_Date;
run;
data final;
merge have summary;
by station;
run;
编辑:删除了 autoname 选项,因为我明确命名了输出变量。
EDIT2:当多个观测值在所有 MIN 或 MAX 变量中包含相同的极值时,PROC MEANS 使用观测值来确定将哪个观测值写入输出。默认情况下,PROC MEANS 使用第一个观察来解决任何关系。但是,如果您指定 LAST 选项,则 PROC MEANS 将使用最后的观察结果来解决任何关系。
推荐阅读
- python - 从python中的单元格中提取某些文本
- android - 如何获取 io.fabric.ApiKey?
- c# - 将 MongoDb 查询转换为 MongoDriver .Net 核心
- python - 在 Python3 中从 URL 获取和解析代理
- python - Tkinter Python 中的双滚动条
- sql-server - 每个部门出勤率最低的前 5 名员工
- android - 部署失败:INSTALL_FAILED_USER_RESTRICTED:安装被用户取消,没有弹出允许窗口
- git - 是否可以为 Haskell Stack --file-watch 添加或排除某些文件,以及如何?
- graph - 我的 SSA 结构正确吗?(重命名)
- sql - SQL:在不使用 PIVOT 的情况下获取多列的差异