Как я могу получить дату от минимальной и максимальной групп? - PullRequest
0 голосов
/ 10 октября 2018

Я разработчик 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

Как вы все можете видеть, я собираю их по станциям и использую функции Min и Max, чтобы получить min_power и max_power.На данный момент мне нужно также получить минимальное время datetime (в lt_dt) и максимальное время datetime (в lp_dt).Я буду ожидать, как показано ниже: ABBA lt_dt - 01SEP2018: 1: 0: 0, в то время как lp_dt - 28AUG2018: 0: 0: 0

Имеется в виду, что lp_dt (datetime основан на max_power), а lt_dt (datetime основан наминимальная мощность)

Моя группа по утверждению выглядит следующим образом:

proc sql;
select 
station
,datetime
,calculatedpower
,min(calculatedpower) as lt_calculatedpower
,max(calculatedpower) as lp_calculatedpower
from sumall
group by 
station
;
quit;

Есть ли способ настроить мой существующий оператор SQL для достижения желаемого времени и даты?Я попробовал дополнительный SQL-оператор, как показано ниже (но он обрабатывает данные 600 КБ навсегда, не уверен, работает ли он или нет, поскольку он все еще выполняется)

proc sql;
select *,
case when calculatedpower=lt_calculatedpower then datetime end as lt_datetime
from minmax;
quit;

С этим кодом, я предполагаю, будетошибка, если имеется несколько строк с одинаковой расчетной мощностью, но разным временем и датой, которые связаны с 1 станцией.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вот краткое изложение SAS PROC и ШАГ ДАННЫХ, чтобы получить конечный желаемый результат.

Используйте параметры MAXID, MINID в операторе OUTPUT, чтобы получить идентификатор максимума и идентификатор минимальных значений.

Первая часть решения генерирует ваши поддельные данные - пожалуйста, предоставьте данные в этом формате в будущем.Затем 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

0 голосов
/ 10 октября 2018

В 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
  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...