вернуть наиболее часто встречающееся значение в каждой группе

Попытка создать таблицу, отображающую наиболее часто встречающийся ndc# для данного пациента (pat_seqno). Мое предложение have не работает до сих пор, и это моя последняя попытка, которая возвращает ошибку, что ndc_count не найден в участвующих таблицах. Спасибо за помощь

proc sql;
create table unique_rx_count as
select pat_seqno , ndc_seqno, ndc_count
from d1
where ndc_seqno in 
    (select count(ndc_seqno) as ndc_count
    from d1
    group by pat_seqno)
group by pat_seqno
having ndc_count =  max(ndc_count)
   ;
quit;

пример: Pat_seqno ndc_seqno 2 45 2 45 2 23 2 45 16 10 16 10 16 78

ожидаемый возврат Pat_seqno ndc_seqno 2 45 16 10


person user2448666    schedule 26.11.2013    source источник
comment
я использую proc sql в sas с импортированным набором данных   -  person user2448666    schedule 26.11.2013
comment
Можете ли вы привести пример вашего входного набора данных и того, что вы ожидаете получить?   -  person scott    schedule 26.11.2013


Ответы (2)


Это быстрое и грязное решение, но оно работает. Сначала я разбиваю его на три отдельных оператора sql:

*count per patient/ndc;
proc sql; 
 create table step1 as 
 select pat_seqno, ndc_seqno, count(*) as ndc_count
 from d1
 group by pat_seqno, ndc_seqno
 ;
quit;

* maxcount per patient;
proc sql;      
 create table step2 as
 select pat_seqno, max(ndc_count) as ndc_count
 from step1
 group by pat_seqno
 ;
quit;

*join count and maxcount;
proc sql;      
 create table want as
 select t1.*
 from step1 t1
 inner join step2 t2
 on t1.pat_seqno = t2.pat_seqno
 and t1.ndc_count = t2.ndc_count
 ;
quit;

и если вы хотите, вы можете объединить его в один оператор SQL

proc sql;
 create table want as
 select t1.*
 from 
 (
  select pat_seqno, ndc_seqno, count(*) as ndc_count
  from d1
  group by pat_seqno, ndc_seqno
 ) t1
 inner join (
  select pat_seqno, max(ndc_count) as ndc_count
  from  (
   select pat_seqno, ndc_seqno, count(*) as ndc_count
   from d1
   group by pat_seqno, ndc_seqno
  )
 group by pat_seqno
 ) t2
 on t1.pat_seqno = t2.pat_seqno
 and t1.ndc_count = t2.ndc_count
 ;
 quit;
person Laurent de Walick    schedule 26.11.2013

Может быть, что-то вроде этого:

SELECT a.pat_seqno, a.ndc_seqno, MAX(b.ndc_count)
FROM d1 a
INNER JOIN (
  SELECT pat_seqno, ndc_seqno, COUNT(*) AS ndc_count
  FROM d1
  GROUP BY pat_seqno, ndc_seqno
  ) b ON b.pat_seqno = a.pat_seqno AND a.ndc_seqno = b.ndc_seqno
GROUP BY a.pat_seqno, a.ndc_seqno
person Filipe Silva    schedule 26.11.2013