簡體   English   中英

如何從最小和最大組中獲取日期?

[英]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_idstationlevel2_seqdatetimexcalculatedpower

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使用最后一個觀察來解決任何關系。

https://documentation.sas.com/?docsetId=proc&docsetTarget=p04vbvpcjg2vrjn1v8wyf0daypfi.htm&docsetVersion=9.4&locale=en#p1p58yhxlrc0can1scam7bco7y96

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM