[英]How do i get the date from a min and max group by?
我是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(基於max_power的日期時間)而lt_dt(基於最小功率的日期時間)
我的分組聲明如下:
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語句的子選擇,該語句標識min和max發生的日期。 子選擇連接到原始表。
注意:SAS SQL將在適當時自動重新加入摘要(聚合函數)結果。
例
在這個例子中level1_id
為station
, level2_seq
為datetime
和x
為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
;
這是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;
編輯:刪除了自動命名選項,因為我明確命名了輸出變量。
EDIT2:當多個觀測值在所有MIN或MAX變量中包含相同的極值時,PROC MEANS使用觀測值來解析要寫入輸出的觀測值。 默認情況下,PROC MEANS使用第一個觀察來解決任何關系。 但是,如果指定LAST選項,則PROC MEANS使用最后一個觀察來解決任何關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.