gpt4 book ai didi

sql - 我如何从最小和最大分组依据中获取日期?

转载 作者:行者123 更新时间:2023-12-04 22:33:14 24 4
gpt4 key购买 nike

我是一名 SAS 开发人员。我有一个 sql 用于从名为“CalculatedPower”的列中获取最小值和最大值。下面是我从一组声明中得到的结构(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 个站点关联的计算功率相同但日期时间不同的行很少,将会出现问题。

最佳答案

在 SQL 中,您将需要使用包含 case 语句的子选择,该语句标识最小值和最大值出现的日期。子选择连接到原始表。

注意:SAS SQL 会在适当的时候自动重新加入汇总(聚合函数)结果。

示例

在此示例中,level1_id 用于stationlevel2_seq 用于datetimex 用于 calculatedpower

data have;
do level1_id = 1 to 5;
do level2_seq = 1 to 5;
x = floor(100*ranuni(123));
output;
end;
end;
run;

proc sql;
create table want as
select
have.*
, min(have.x) as min_x
, max(have.x) as max_x
, min(at.min_at) as min_x_first_at_seq
, min(at.max_at) as max_x_first_at_seq
from
have
left join
(
select inside.level1_id, inside.level2_seq
, case when inside.x = min(inside.x) then inside.level2_seq else . end as min_at
, case when inside.x = max(inside.x) then inside.level2_seq else . end as max_at
from have inside
group by inside.level1_id
) at
on
have.level1_id = at.level1_id and
have.level2_seq = at.level2_seq
group by
have.level1_id
order by
have.level1_id, level2_seq
;

关于sql - 我如何从最小和最大分组依据中获取日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com